#00FF00Android的Styles(样式)和Themes(主题)非常类似于web开发中的CSS,方便开发者将页面内容与布局呈现分离。Style和Theme在Android中的定义方式完全相同,两者只是概念上的不同:Style作用于单个视图或控件,而Theme作用于Activity或整个应用程序。由于范围不同,Theme也需要包含比Style更多的定义属性值的项目(items)。但是,在本文中,我将Style和Theme都称为Style。AndroidStyle与WebCSS相比有一个缺陷,即只能通过android:theme="@style/AppTheme"或style="@style/MyStyle为一个对象指定一个值。而CSS则可以通过class属性在DOM元素上定义多种样式,达到组合的效果。不过Style还有一个CSS没有的功能,那就是继承(Inheritance)。(当然,CSS也通过LESS、SASS等工具获得了继承的能力。)Style继承介绍根据AndroidDevelopers官方文档,定义Style的继承有两种方式:一种是通过parentflagparentStyle;#00FF00另一种是使用父Style的名字作为前缀,然后通过“.”连接新定义的Style的名字:#FF0000第二种方法可以***连接子Style来练习多层继承:30sp相对于第一种方式,Android对第二种方式的限制是Style必须自己定义,或者parentStyle和childStyle必须定义在同一个程序中,不能引用第三方或系统的Style。毕竟系统的Style的引用需要加上android:作为命名空间的前缀。其次,在使用Style时,对于第二种方式定义的Style,其全名必须加引号,即必须包含完整的前缀和名称:Android对第一种定义方式没有限制,所以第二种方式定义的所有Style都可以转换为第一种:30sp只要parent中的名称与实际定义的Style名称对应即可。但是如果改成第一种后Style的名字过于简洁,容易产生冲突。两种继承方式混合使用的效果前面说了,Style的两种继承方式效果是一样的。如果将这两种方法混合在一起定义一个Style,会发生什么情况呢?下面用一个实际的例子来分析一下。.先定义一些实验需要的自定义属性(attr),(这样可以减少系统属性的干扰,因为系统会一直为它的属性定义值,所以可能无法判断最新的效果是否来自系统或定义的值)然后定义一个TextView的子类,获取上面自定义属性的值并赋值它到TextView来渲染:importandroid.util.TypedValue;importandroid.widget.TextView;/***@authorIder*/publicclassStyledTextViewextendsTextView{publicStyledTextView(Contextcontext){this(context,null);}publicStyledTextView(Contextcontext,AttributeSetattrs){this(context,attrs,0);}publicStyledTextView(Contextcontext,AttributeSetattrs,intdefStyleAttr){super(上下文,attrs,defStyleAttr);finalTypedArraya=context.getTheme().obtainStyledAttributes(属性,R.styleable.CustomStyle,defStyleAttrr,0);finalCharSequencetext=a.getText(R.styleable.CustomStyle_customText);finalintcolor=a.getColor(R.styleable.CustomStyle_customColor,Color.RED);finalfloatsize=a.getDimensionPixelSize(R.styleable.CustomStyle_customSize,70);a.recycle();setText(text);setTextColor(color);setTextSize(TypedValue.COMPLEX_UNIT_PX,size);}}然后就是确定研究所需的样式@android:color/holo_orange_darkHelloWorld30dpwww.iderzheng.com@android:color/holo_blue_darkblog.iderzheng.com在上面定义的Style中,SuperStyleOne将通过添加前缀作用于子Style,而SuperStyleTwo将通过分配给父级来发挥作用。您可以看到SubTwo和SubThree以两种方式混合。***在Activity的布局视图里使用自定义类并设置上不同的Style运行后效果如下:第一种和第二种是Style的标准使用方法,另见Until他们正确的获取了定义的属性值,子Style也正确的继承和覆盖了父Style的属性值。对于第三个和第四个,它们渲染的颜色是代码中使用的默认红色(Color.RED),字体的值也是从代码中使用的值导出的,所以明显小于前两个。这意味着它们不继承SuperStyleOne中定义的字体大小和颜色。而SuperStyleTwo中定义的内容被第三个正确显示,这也说明SubTwo成功继承了parent指定的父Style的内容。第四个显示的内容说明覆盖效果也是正确的。在做这个实验之前,我一直认为这两种方法可以同时起作用,但是指定withparent比使用prefix有更高的优先级。也就是说,Android会先从当前的Style定义中找到某个属性的值。如果没有找到,就会去parent指定的父Style中寻找。如果没有,就会到前缀指定的父Style中去寻找。但是从上面的结果可以看出:当使用parent来指定父Style时,prefix方法并没有起到什么作用,只是作为Style的名称。也就是说:AndroidStyle不支持多重继承。样式继承只能一层一层地进行。反之,看系统定义的Style更容易理解。比如你打开themes_holo.xml,你会看到在Theme.Holo和Theme.Holo.Light这两个Style下“冗余”定义了很多相同的内容。但是因为Theme.Holo.Light使用parent来指定它的父Style是Theme.Light,所以Theme.Holo.Light并没有从Theme.Holo继承任何属性值,所以这样的冗余是必要的。.........使用Theme.Holo.Light作为Style的名称只是为了名称更清楚。参考资料:风格和主题|Android开发人员AndroidXML主题继承自两个父主题?–堆栈溢出xml–样式属性不使用android:命名空间前缀的原因–堆栈