Android中的Theme、Style、Attrs

一简介

最近看一篇分析简书和知乎夜间模式的文章,涉及到了Theme,Style,Attrs的知识,就此总结一下。

二 Theme和Style

Theme和Style都是多种属性的集合,定义方式也一致,但应用范围有区别。Style应用于UI组件上,Theme应用于Application或者Activity上。这种概念的区别,说明了Theme和Style中包含的属性会有极大的差别。

2.1 定义Theme和Style

Theme和Style一般会在res/values/styles.xml中定义。如果Theme和Style较多,也可以在themes.xml中定义Theme,在styles.xml中定义Style。实际上values下的文件用来定义字符串、颜色、属性、风格、主题等,文件名可以任意命名的,之所以这样是为了遵循规范,便于查找和使用。
定义Theme的例子:

Paste_Image.png

定义Style的例子:


Paste_Image.png

2.2 应用Theme和Style

1 文件中配置
在AndroidManifest.xml中的application和activity标签都有android:theme可以应用Theme。在布局文件中每个控件都有style属性来应用Style。

2 代码中配置
application和activity提供了setTheme方法用来应用Theme。需要注意的是该方法要在任何View初始化之前调用,否则并不刷新UI。

三 Attrs

Theme和Style是多种属性的集合,布局中的各个控件需要设置属性。这些属性除了由系统定义以外,我们开发者也可以自定义属性,并且在自定义View的时候会频繁使用。

3.1 定义Attrs

在res/values/attrs.xml中定义如下:


Paste_Image.png

3.2 应用Attrs

定义好Attr后,可以直接在Theme、Style和布局的控件中使用。

Paste_Image.png

四 应用场景

4.1 透明栏

Android5.0新增了几个属性,通过在Theme中配置这些属性的值,可以实现透明栏效果。

Paste_Image.png

由此可知,在Theme中配置colorPrimaryDark的值,就可以决定状态栏的颜色。要注意的是该属性只在5.0中有作用,Theme也应该定义在values-v21中。

4.2 夜间模式

具体可以看文末的参考文章,写的很好。这里只概括总体思路,如下:
1 定义两套主题,如下:


Paste_Image.png

2.代码中切换主题


Paste_Image.png

参考

1 知乎和简书的夜间模式实现套路

推荐阅读更多精彩内容