Skip to content

组件的全局配置与特殊处理

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);

之后就是按原有方式使用组件了。