日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

Android之styles.xml,以及自定义风格

發(fā)布時(shí)間:2023/12/31 综合教程 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 Android之styles.xml,以及自定义风格 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。