-
Notifications
You must be signed in to change notification settings - Fork 2.7k
组件的全局配置与特殊处理
cgspine edited this page Jun 4, 2018
·
1 revision
QMUI 的很多组件是依靠 theme 来进行样式管理的,目的就是为了全局控制,一修改,全局更新。
以 QMUIPopup 背景为例,背景是一张带阴影的 9png,箭头是张单独的 png, 这样做的原因是便于动态处理箭头的位置。而缺点也显而易见,要更换背景,就要同时更换二者以及和阴影相关的值。(后期会用 QMUILayout 重构它,这样就不会存在和阴影相关的系列麻烦问题。)
如何更改背景:
我们需要在主题下覆盖一下几个 item :
<item name="qmui_popup_bg">@drawable/qmui_popup_bg</item>
<item name="qmui_popup_arrow_down">@drawable/qmui_popup_arrow_down</item>
<item name="qmui_popup_arrow_up">@drawable/qmui_popup_arrow_up</item>
<item name="qmui_popup_arrow_up_margin_top">13dp</item> <!-- 由 qmui_popup_bg 的阴影决定 -->
<item name="qmui_popup_arrow_down_margin_bottom">13dp</item><!-- 由 qmui_popup_bg 的阴影决定 -->
这样就实现了 QMUIPopup 背景的配置。
然而这样并不能满足所有需求,不同的界面可能需要不同的背景,我们需要特殊化。
如何特殊化背景:
Android 为我们提供了 ContextThemeWrapper,基于 Theme 管理的样式,都可以利用 ContextThemeWrapper 来实现特殊化:
首先, 提供一份特殊化的 style:
<style name="custom_popup">
<item name="qmui_popup_bg">@drawable/custom_popup_bg</item>
<item name="qmui_popup_arrow_down">@drawable/qmui_popup_arrow_down</item>
<item name="qmui_popup_arrow_up">@drawable/qmui_popup_arrow_up</item>
<item name="qmui_popup_arrow_up_margin_top">6dp</item>
<item name="qmui_popup_arrow_down_margin_bottom">6dp</item>
</style>
然后,按下面的方式构造 QMUIPopup 实例:
Context context = new ContextThemeWrapper(getContext(), R.style.custom_popup);
QMUIPopup popup = new QMUIPopup(context, QMUIPopup.DIRECTION_NONE);
之后就是按原有方式使用组件了。