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