计算机Android知识Android技术知识

《Android编程权威指南》之样式与主题篇

2016-11-30  本文已影响244人  夜远曦白

此章的内容比较简单,学习此章的目的呢,也是为了简化代码去美化页面,定制出APP的独特风格。

颜色资源

截图取自Demo项目

样式

样式是一套能够应用于视图的属性,可以为很多组件共用,更新修改属性时,只修改公共样式定义即可。

截图取自demo项目 截图取自demo项目

样式继承

样式支持继承,一个样式能继承并覆盖其他样式的属性。

截图取自demo

BeatBoxBtn.Strong的命名表示这个新样式继承了BeatBoxBtn样式的属性

截图取自demo

指定父样式的方式也可以表示样式继承。

主题

主题可以看作样式的进化加强版。同样是定义一套公共主题属性,样式属性需要逐个添加,而主题则会自动应用于整个应用。主题属性能引用颜色这样的外部资源,也能引用其他样式。

修改默认主题

自带默认主题AndroidManifest.xml文件,application标签下的theme属性,指向AppTheme主题,也是定义在styles.xml中。

截图取自demo 主题实际上就是一种样式,但是主题指定的属性有别于样式。 截图取自demo

添加主题颜色

在style.xml中,为AppTheme主题添加三个自定义属性

截图取自demo 样式主题仅适用于单个组件;主题属性适用于所有使用同一主题的组件。colorPrimary属性主要用来设置工具栏背景色,也可称为应用品牌色,colorPrimaryDark用户屏幕顶部的状态栏,colorAccent主要用于给EditText这样的组件着色。注意:只有Lollipop以后的系统支持状态栏主题颜色。对于之前的系统,无论指定什么主题颜色,状态栏都是不变的黑底色。

从网上截了个图,看图就明白了这些属性的意思啦!

截图取自网上

注意,只有Lollipop以后的系统支持状态栏主题色。对于之前的系统,无论指定什么主题色,状态栏都是不变的黑底色。

覆盖主题属性

主题已经设置了背景色,在此基础上再设置其他颜色,就是多出来在做额外的工作。而且,在应用里到处复制使用背景属性设置代码也不利于后期维护。

<item name="android:colorBackground">@color/background_material_dark</item>

再定位到Theme中看看也行(截图只取部分),也看到了这个属性:

Paste_Image.png

回到styles.xml文件,覆盖背景属性,即可改变整个应用的背景颜色:

Paste_Image.png 我实际操作的主题继承层次跟此书中的有点改变,想找哪个属性,按照这种方式找就OK了,截图均为我实际操作得到。

修改按钮属性

可在主题中定义一个用户所有按钮的样式,刚刚Base.V7.Theme.AppCompat中和Theme中均有buttonStyle属性,即应用中普通按钮的样式。

Base.V7.Theme.AppCompat Theme Theme中Widget.Button

应用中所有按钮都使用了这些属性。
修改按钮的父样式,根据需求,有选择性的修改一些属性。

Paste_Image.png

然后修改主题的buttonStyle属性:


Paste_Image.png

搞定。
注意,定义buttonStyle时,没有使用android:前缀。这是因为,要覆盖的buttonStyle属性是在AppCompat库里实现的。

深入学习:样式继承拾遗

要以主题名的形式指定父主题,有继承关系的两个主题都应处于同一个包中。因此,对于Android操作系统内部主题间的继承,就可以直接使用主题名继承表示法。同理,AppCompat库内部也是这样。然而,一旦AppCompat库要跨库继承,就一定要使用parent属性。

开发自己应用时,如果是继承自己内部的主题,使用主题名指定父主题即可;如果是继承Android操作系统中的样式或主题,记得使用parent属性。

深入学习:引入主题属性

在主题定义好属性后,可以在XML或代码中直接使用它们。

Paste_Image.png 上述中?符号的意思是使用colorAccent属性指向的资源。这里指定义在colors.xml中的粉色。

代码中使用主题属性比较啰嗦:

Resources.Theme theme = getActivity().getTheme();
        int[] attrsToFetch = {R.attr.colorAccent};
        TypedArray a = theme.obtainStyledAttributes(R.style.AppTheme, attrsToFetch);
        int accentColor = a.getInt(0, 0);
        a.recycle();

先取得Theme对象,然后要求它找到定义在AppTheme(即R.style.AppTheme)中的R.attr.colorAccent属性。结果得到一个持有数据的TypedArray对象。接着,像TypedArray对象索要int值以取出颜色即可使用了。

上一篇下一篇

猜你喜欢

热点阅读