android style和theme

发表于:,更新于:,By Sally
大纲
  1. 1. 使用系统风格和主题
  2. 2. 自定义style & theme
    1. 2.1. 在res/values文件夹下定义styles
  3. 3. 样式(style)的继承 inheritance
    1. 3.1. 通过parent标识父style
    2. 3.2. 通过style名字作为前缀,然后通过.链接新定义的style名称
  4. 4. 两种继承方式的比较
  5. 5. 两种继承方式的混合效果
  • style定义在单个视图或者控件上

  • theme用于activity或整个app上

  • 由于作用范围的不同,theme就需要比style包含更多的定义属性值的item

使用系统风格和主题

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

  • 创建style资源文件

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">#00FF00</item>
<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>

两种继承方式的混合效果

  • demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// style
<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
// CustomTextView
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不支持多继承)