androidqmui教程,【QMUI教程】AndroidTheme的使⽤
QMUI Android 对外发布了⼀两天了,收到了⼀些意见和建议,感觉⽐较突出的⼀个问题就是 Theme 的问题,今天就来聊聊这个话题。
起步
⽇常开发过程中,我们很少有机会去触碰到 theme,也很少有⽂章提及到 theme, 更没有依赖 theme 去开发 UI 组件的,QMUI 应该是除了 Android 官⽅组件外唯⼀的⼀个会依赖 theme 的开源库吧,⾄少⽬前我没发现有其它库是这么做的。我们这么做的原因主要是让 UI 组件可配置化,分为两个⽅⾯:
不同的项⽬对颜⾊、间距、字体⼤⼩等的要求都不相同
同⼀个项⽬对同⼀个组件有统⼀化的配置,并且需要做到差异化
所以在引⼊ QMUI 时,⼀定要记得在 AndroidManifest 中更新 Application 或者 Activity 的 theme。
针对整个 Application:
...
android:theme="@style/QMUI.Compat">
...
针对某个特定的 Activity:
android:name="..."
...
android:theme="@style/QMUI.Compat"/>
⼀般⽽⾔,我们都会在 l⾥添加⼀个 AppTheme 来作为项⽬的 base theme,Android Studio 创建项⽬ 默认都会帮我们做好这⼀步,因此我们只需要更改 AppTheme 的 parent就⾏。
关于 QMUI 和 QMUI.Compat
QMUI 提供了两套 theme: QMUI 和 QMUI.Compat:
QMUI 继承⾃ android:Theme.Holo.Light (4.x) 和 android:Theme.Material.Light (>=5.0),我们⾃⼰做了 Android L 前后 theme 的兼容
QMUI.Compat 继承⾃ Theme.AppCompat.Light。这是系统做好了各个版本 theme 兼容的处理
Android 官⽅是推荐⽤ AppCompat 系列, Android Studio 默认⽣成的 Activity 都是 AppCompatActivity 。此外,AppCompatActivity 、 CoordinatorLayout 、 TextInputLayout 等都必须在 AppCompat Theme 下运⾏,否则会 crash。因此⼤多数情况,你都应该使⽤ QMUI.Compat。只有当⾯对⼀些⽼项⽬,使⽤ QMUI.Compat 可能会造成较⼤影响时,才应该使⽤前⼀个theme。
⽤ theme 进⾏配置的⼀个例⼦
这⾥我⽤ QMUITabSegment 的配置来举个例⼦, QMUITabSegment 是⼀个类似于 TabLayout 的组件,但⽐它有更丰富的效果,具体可以下载 QMUI Demo 进⾏查看。
先说⼀下 QMUITabSegment 的配置项:
是否有 indicator: qmui_tab_has_indicator
indicator ⾼度: qmui_tab_indicator_height
indicator 是否在顶部: qmui_tab_indicator_top ,为false则在底部
item 的字体⼤⼩: android:textSize
item 的宽度是均分还是跟随内容宽度: qmui_tab_mode
item 如果有icon,icon的位置在上下左右哪个位置: qmui_tab_icon_position
⼀个⾃定义 view 的强⼤之处就是可以添加很多⾃定义属性,但如果每次使⽤这个组件都要去重复写⼀遍这些属性,那会是很烦的,如何解决这种问题呢?有三种解决⽅案:
⽤⼀个类如 AppTabSegment 去继承 QMUITabSegment ,⽤ java 代码去 set ⼀遍这些属性
抽取⼀个公⽤的 style,在使⽤处引⽤
利⽤ View 构造器的第三个参数,通过 theme 来配置,使⽤者感知不到配置的存在(QMUI 采⽤的⽅案)
第⼀种维护起来并不会优雅;第⼆种每次使⽤时都要去引⼊⼀遍 style,如果忘了 style 的名字, 还得去查;⽽在第三种配置下,使⽤者不需要做额外的事情,只需要⼀次配置即可,相当优雅。例如做如下配置:
@style/AppTabSegment
false
1dp
false
14sp
left
fixed
这样在使⽤的时候不加任何特殊的属性就能获得上述特效,有需要的话依然可以覆写部分属性,这对 QMUITabSegment 、QMUIPullRefreshLayout 这种整个 App 基本上只有⼀个样式的组件是⾮常完美的配置⽅案。
QMUI 的所有⾃定义组件的属性都在 l , 其它 App 公⽤的值的定义都在 qmui_l 。有需要的话可以去看看。
如何获取 theme 中定义的属性的值?
这个问题涉及android中 “@” 和 ”?“ 的区别:
@: 如 @color、@string、@drawable,表⽰去取已经定义好的资源
:只有 attr 的使⽤⽅式,表⽰去对应的 theme 中获取相应的资源,不同的 actvitiy 可以有不同的 theme, 取出来的值也就可以不⼀样
如果你想某⼀个 layout 布局的作⽤ margin 等于 theme 中定义好的 qmui_content_spacing_horizontal ,那你可以这样:
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginLeft="?attr/qmui_content_spacing_horizontal"
mui框架常用组件有哪些android:layout_marginRight="?attr/qmui_content_spacing_horizontal">
最后,欢迎⼤家试⽤,如果有任何意见或建议,欢迎留⾔或者在 Github 创建 issue。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论