Android也可以像HTML/CSS中的style一樣,使用自定義的style樣式。Android一般通過value 文件夾下面新建一個(gè)styles.xml文件來設(shè)置自定義樣式。這里開發(fā)者可以設(shè)置高度、填充字體顏色、字體大小、背景顏色等描述一個(gè)View或者一個(gè)窗口的顯示屬性。這就像Web開發(fā)中的CSS樣式表,使我們的樣式獨(dú)立于內(nèi)容進(jìn)行設(shè)計(jì)開發(fā)。
主題和樣式都是通過在xml文件中預(yù)定義一系列屬性值,通過這些屬性值來形成統(tǒng)一的顯示風(fēng)格。不同的是,樣式只能應(yīng)用于某種類型的View;而主題剛好相反,不能應(yīng)用于特定的View,而只能作用于一個(gè)或多個(gè)Activity,或是整個(gè)應(yīng)用。
下面通過代碼學(xué)習(xí)一下如何自定義樣式與主題,并在程序中應(yīng)用。
首先是自定義樣式和主題。在項(xiàng)目的res/values/目錄下添加styles.xml。如代碼清單1所示。
代碼清單1 styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 定義my_style_1,沒有指定parent,用系統(tǒng)默認(rèn)的 -->
<style name="my_style_1">
<!-- 定義與指定View相關(guān)的若干屬性 -->
<item name="android:hint">load from style 1</item>
</style>
<!-- 定義my_style_2,用自定義的my_style_1作為parent -->
<style name="my_style_2" parent="@style/my_style_1">
<!-- 定義與指定View相關(guān)的若干屬性 -->
<item name="android:textSize">30sp</item>
<item name="android:textColor">#FFFF0000</item>
<item name="android:hint">load from style 2</item>
</style>
<!-- 定義my_style_3,用android的EditText作為parent -->
<style name="my_style_3" parent="@android:style/Widget.EditText">
<!-- 定義與指定View相關(guān)的若干屬性 -->
<item name="android:hint">"load from style 3"</item>
<item name="android:textStyle">bold|italic</item>
<item name="android:typeface">monospace</item>
<item name="android:background">@drawable/mybackground</item>
</style>
<!-- 定義MyTheme,用android的Theme作為parent -->
<style name="MyTheme" parent="@android:style/Theme">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#FF0000FF</item>
<item name="android:hint">"load from style 3"</item>
<item name="android:textStyle">bold|italic</item>
<item name="android:typeface">monospace</item>
<item name="android:background">@drawable/gallery_selected_pressed</item>
<item name="myStyle">@style/my_style_3</item>
</style>
</resources>
由上述代碼可以看出,主題和樣式都可以通過在<style>下添加多個(gè)<item>來完成其定義。下面來介紹一下<style>的屬性,如表1所示。
表1 <style>的屬性
屬性名稱 |
描述 |
name |
style的名字,引用該style時(shí)使用此名字 |
parent |
一些在自定義的style中沒有指定的屬性會(huì)繼承parent style中的值。parent可以是android預(yù)定義的resource,也可以是自己定義的style。為可選項(xiàng) |
在<item>中定義需要改變的屬性值,例如,可以定義顏色、高度等。Android中能使用的屬性可以在<sdk>/docs/reference/android/R.styleable.html中查到;也可以用自己定義的屬性值。
下面講解如何在程序中使用樣式:一方面可以在layout的布局文件中指定自定義的樣式;另一方面可以在java代碼中指定。具體代碼如代碼清單2、3所示。
代碼清單2 在布局文件中指定自定義樣式
<EditText android:id="@+id/EditText03"
style="@style/my_style_3"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</EditText>
代碼清單3 在java代碼中指定自定義樣式
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout ll = (LinearLayout)findViewById(R.id.main);
EditText et = new EditText(this, null, R.attr.myStyle);//指定樣式
ll.addView(et);
}
如何在程序中使用自定義主題呢?這與使用自定義樣式相似,都可以通過兩個(gè)方法指定,不同的是主題除了可以在java代碼中指定以外,還可以在AndroidManifest中被指定。具體代碼如代碼清單4、5、6所示。
代碼清單4 在AndroidManifest.xml中指定自定義主題——應(yīng)用于整個(gè)程序
<application android:theme="@style/MyTheme">
代碼清單5 在AndroidManifest.xml中指定自定義主題——應(yīng)用于Activity
<activity android:theme="@style/MyTheme">
代碼清單6 在java代碼中指定自定義主題
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.MyTheme);//設(shè)置主題
setContentView(R.layout.main);
}
注:setTheme必須在setContentView(),addContentView()或inflate()等實(shí)例化View的函數(shù)之前調(diào)用。