使用系统风格和主题
use platform styles and themes
- to make your activity look like a dialog box:
1
| <activity android:theme="@android:style/Theme.Dialog" >
|
- to make your activity have a transparent background:
1
| <activity android:theme="@android:style/Theme.Translucent" >
|
- to apply your own custom theme defined in
/res/values/styles.xml
1
| <activity android:theme="@style/customTheme" >
|
- to apply theme to your entire app(all activities), add the
android:theme
attribute to the <application>
element:
1
| <application android:theme="@style/customTheme" >
|
自定义style & theme
在res/values
文件夹下定义styles
parent
属性是可选的,指定其父样式,如果需要,可以重写继承的样式
1 2 3 4 5 6 7 8 9
| <?xml version="1.0" encoding="utf-8"?> <resources> <style name="CustomTheme" parent="@android:style/TextApperarance.Medium"> <item name="android:layout_width">martch_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor"> <item name="android:typeface">monospace</item> </style> </resources>
|
1 2 3
| <TextView style="@style/CustomTheme" android:text="@string/hello"/>
|
样式(style)的继承 inheritance
可以继承一个已经存在的style,添加或者改变一些attribute
也可以继承自己创建的style
- 一般的: 如果是继承已有的style,需要使用
parent
, 如果是继承自己创建的,如GreenText
,就不必使用parent了,命名带上前缀就ok了
1 2 3 4 5 6 7
| <style name="CreenText" parent="@android:style/TextAppearance"> <item name:android="android:textColor">#00FF00</item> </style>
<style name="CreenText.Red"> <item name="androis:textColor">#FF0000</item> </style>
|
通过parent
标识父style
1 2 3
| <style name="GreenText" parent="@android:style/TextAppearance"> <item name="android:textColor">#00FF00</item> </style>
|
通过style名字作为前缀,然后通过.
链接新定义的style名称
1 2 3
| <style name="CodeFont.Red"> <item name="android:textColor">#FF000000</item> </style>
|
- 这种方式可以无限链接子style来实现更多层的继承
1 2 3
| <style name="CodeFont.Red.Big"> <item name="android:textSize">30sp</item> </style>
|
两种继承方式的比较
相对于第一种(parent)继承方式,第二种(style名字作为前缀)继承方式作出的限制就是:style必须是由自己定义的,或者说父style和子style必须是定义在同一个程序内,不能是应用第三方或系统的style。(毕竟对于系统的style的引用是需要加上android:前缀作为命名空间的)
其次,在使用style时,对于第二种方式定义的style,必须引用其完全的名字,即必须包含完整的前缀和名字。
1 2 3
| <TextView style="@style/CodeFont.Red.Big" />
|
- android对于第一种(parent)继承方式并没有限制,所以第二种继承方式(style名字作为前缀)定义的style也可以转成第一种方式
1 2 3 4
| // 这种写法,起名无力。一不小心,名字一简洁,就冲突了-_-||| <style name="Big" parent="CodeFont.Red"> <item name="android:textSize">30sp</item> </style>
|
两种继承方式的混合效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <style name="SuperStyleOne"> <item name="custom_color">#0f0</item> <item name="custom_text">hello word!!!</item> <item name="custom_size">20sp</item> </style>
<style name="SuperStyleTwo"> <item name="custom_text">hello sally!!!</item> </style>
<style name="SuperStyleOne.SubOne"> <item name="custom_color">#050</item> </style>
<style name="SuperStyleOne.SubTwo" parent="SuperStyleTwo"> </style>
<style name="SuperStyleOne.SubThree" parent="SuperStyleTwo"> <item name="custom_text">aiyaya...SuperStyleOne.SubThree...parent.SuperStyleTwo</item> </style>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomStyle); int color = typedArray.getColor(R.styleable.CustomStyle_custom_color, Color.RED); CharSequence text = typedArray.getString(R.styleable.CustomStyle_custom_text); float dimension = typedArray.getDimension(R.styleable.CustomStyle_custom_size, 50); typedArray.recycle();
setText(text); setTextColor(color); setTextSize(dimension); }
|
- 当使用parent制定父style后,前缀方法则不再起作用,只是作为style的名字。(android的style不支持多继承)