Android之styles.xml,以及自定义风格
1.styles.xml
在現(xiàn)在的ADT創(chuàng)建的Project中,會(huì)有values,values-v11和values-v14三個(gè)文件夾,每個(gè)文件夾下都有一個(gè)styles.xml.
API11是Android3.0,API14是Android4.0。這三個(gè)文件夾里的style.xml是這個(gè)意思:
values文件夾里的styles.xml是為沒有指定API的系統(tǒng)版本指定的風(fēng)格,我理解的就是API11以下的版本所用的風(fēng)格。這個(gè)styles.xml里面有兩個(gè)style標(biāo)簽,第一個(gè)是:
<style name="AppTheme" parent="AppBaseTheme">
注意他繼承了AppBaseTheme。當(dāng)然你可以在AppTheme里給3.0以下的機(jī)型弄一些自己的風(fēng)格。第二個(gè)是:
<style name="AppBaseTheme" parent="@android:style/Theme.Light">
也就是第一個(gè)的AppTheme的parent標(biāo)簽。而AppBaseTheme的父類就是系統(tǒng)built in的風(fēng)格了。注意這個(gè)“parent="@android:style/Theme.Light”是沒有調(diào)用appcompat的類庫(kù)的,如果調(diào)用了則會(huì)是“Theme.AppCompat.Light”。
values-v11里的styles.xml是這個(gè)意思:
Base application theme for API 11+. This theme completely replacesAppBaseTheme from res/values/styles.xml on API 11+(3.0) devices.
在API 11+的機(jī)器上,之前values文件夾里的styles.xml的AppTheme標(biāo)簽就不再直接繼承那個(gè)文件里的AppBaseTheme,改為繼承values-v11文件夾里的這個(gè)AppBaseTheme。
values-v14同理,在4.0以上的機(jī)器上用這個(gè)文件夾的風(fēng)格。
這就是為什么同一個(gè)應(yīng)用在不同的機(jī)器上顯示不同的風(fēng)格,比如values-v11中:
<style name="AppBaseTheme" parent="@android:style/Theme.Holo.Light">
而values-v14中:
<style name="AppBaseTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
就會(huì)顯示黑白兩種風(fēng)格。
不過Android 3.x的機(jī)器很少,大部分人都在用4.x或是停留在2.x。所以values-v11常常不用動(dòng)。
2.自定義風(fēng)格
按照Android Developers里的Customize the Background的描述,如何改ActionBar的背景呢?分為3.0以上 和 2.1以上,3.0以下兩種處理方式。對(duì)于2.1以上3.0以下,用appcompat的library,可以在values文件夾定義一個(gè)themes.xml,內(nèi)容是:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
parent="@style/Theme.AppCompat.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<!-- Support library compatibility -->
<item name="actionBarStyle">@style/MyActionBar</item>
</style>
<!-- ActionBar styles -->
<style name="MyActionBar"
parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
<item name="android:background">@drawable/actionbar_background</item>
<!-- Support library compatibility -->
<item name="background">@drawable/actionbar_background</item>
</style>
</resources>
可以看到,android:actionBarStyle和actionBarStyle都o(jì)verride了MyActionBar,而MyActionBar用中的android:background和background又都覆寫了新的drawable,這是分兩步完成的。至于要不要加"android:",從注釋看出來,不加android:的是支持appcompat類庫(kù)的風(fēng)格的。
把"@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse"一層層追溯到最后,可以看到的是一個(gè)沒有用到Appcompat風(fēng)格的style:
里面有一個(gè)android:background.可以看到它的屬性是@android:drawable....,推測(cè)含有android:..前綴的屬性都是系統(tǒng)自帶的資源,包括上面的android:background.
然后,在manifest里用:
<application android:theme="@style/CustomActionBarTheme" ... />
來應(yīng)用風(fēng)格。
那么為什么@style可以找到themes.xml里的風(fēng)格呢。我嘗試把themes.xml重命名一下,改成了"asd.xml",發(fā)現(xiàn)仍然顯示新的風(fēng)格。總是可以找到的。也許這就是為什么大型的APP里有大量各種自己命名的xml。暫且命名為ationbar.xml好了。
我我嘗試把a(bǔ)ctionbar.xml里的內(nèi)容再轉(zhuǎn)移到styles.xml的時(shí)候,ADT卻在android:background處報(bào)錯(cuò)說需要minsdk:11,當(dāng)前為8。
于是我把這些內(nèi)容移到values-v14文件夾的styles.xml中,果然不報(bào)錯(cuò)了——這三個(gè)values文件夾是有最低sdk版本要求的。運(yùn)行,正常。
但是當(dāng)我「性致勃勃」地將actionbar.xml恢復(fù)原狀,恢復(fù)到最初的不要求最低版本SDK的values文件夾中的時(shí)候,F(xiàn)UCK,竟然開始報(bào)錯(cuò)了,剛才可是都正常運(yùn)行了的啊。。。這一定是ADT又犯病了跟我沒關(guān)系。。于是我把a(bǔ)ctionbar.xml轉(zhuǎn)移到valuse-v11文件夾里,不報(bào)錯(cuò)。但是在運(yùn)行在Android2.3上的時(shí)候報(bào)錯(cuò)說;
“You need to use a theme.Appcompat theme..”
這很好理解,因?yàn)樵趍anifest里指定的風(fēng)格是:
<application android:theme="@style/CustomActionBarTheme" ... />
而在valuse文件夾找不到這個(gè)風(fēng)格。
方法是:
把
<item name="android:actionBarStyle">@style/MyActionBar</item>
<item name="android:background">@drawable/actionbar_background</item>
兩行刪去,再另存為actionbar.xml,復(fù)制到valuse文件夾里,于是可以在2.3運(yùn)行了。這就更印證了帶有「android:」前綴的資源的是系統(tǒng)自帶的資源,不能在低版本override(覆寫)。
下面要考慮的事情是,第一,改變其他風(fēng)格。
第二,有個(gè)疑問是,如果用這個(gè)代碼應(yīng)用風(fēng)格:
<application android:theme="@style/CustomActionBarTheme" ... />
那么豈不是只能應(yīng)用一種風(fēng)格?其他xml文件里怎么整?這個(gè)問題可以參考反編譯出來的人家的應(yīng)用。先去吃飯了。
--------------------
「知乎」的manifest里面是這樣用不同的theme的:
每一個(gè)Activity都指定theme。
接下來是自定義ActionBar的文字顏色。
官方教程上給出了這樣的代碼(節(jié)選):
<style name="CustomActionBarTheme"
parent="@style/Theme.AppCompat">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
<item name="android:actionMenuTextColor">@color/actionbar_text</item>
.....
parent從之前的parent="@style/Theme.AppCompat.Light.DarkActionBar"
變成了:parent="@style/Theme.AppCompat",但是由于之前的那個(gè)與現(xiàn)在的是繼承關(guān)系,所以之前的能覆寫,現(xiàn)在的就肯定能覆寫了。
其中的這兩行:
<item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item> <item name="android:actionMenuTextColor">@color/actionbar_text</item>
第一個(gè)item跟原來一樣,加上:
<!-- ActionBar tabs text 其實(shí)就是「Navigation Tabs的文字顏色」-->
<style name="MyActionBarTabText"
parent="@style/Widget.AppCompat.ActionBar.TabText">
<item name="android:textColor">@color/actionbar_text</item>
<!-- The textColor property is backward compatible with the Support Library -->
</style>
即可,注意,這個(gè)「TabText」是改變Navitation Tabs的顏色的。
第二個(gè)item,需要在values文件夾建立一個(gè)color.xml(試了一下,跟其他的style一樣,這個(gè)xml也可以任意命名,但還是命名成color好了畢竟不需要很多這種顏色定義的文件),
內(nèi)容是:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="actionbar_text">#FF0000</color>
</resources>
這樣我就把a(bǔ)ctionbar_text設(shè)置成了紅色。
附上改變ActionBar顏色的方法:
總結(jié)
以上是生活随笔為你收集整理的Android之styles.xml,以及自定义风格的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CHM文件出现的常见错误及解决办法
- 下一篇: 《概率统计》9.状态转移:初识马尔科夫链