2016年4月23日 星期六

Android Style(樣式) & Theme(主題) Q&A

Style : 應用元件的多個屬性的集合,簡言之,就是把多個想指定的屬性一次寫好,包成一個模組,以後直接套用在需要設定這些屬性的原件上,省得每個元件都要重複設定一堆同樣的屬性。

Theme : 算是Style,不過是應用Activity


Q1.如何讓Activity套用Theme?

A1.

在Xml中
在AndroidMenifest中<application>或<Activity>標籤中使用android:Theme屬性

如設定在<application>標籤中,代表整個app都套用該Theme
如設定在<activity>標籤中,代表只有activity套用該Theme
<activity>中的設定會覆蓋<application>的

打開AndroidMenifest中會發現在<application>中設定了

android:theme="@style/AppTheme"

這是預設的,只是個style的名字,可以直接在這改使用別的Theme,也可以維持使用AppTheme然後改AppTheme這個style的內容

所以去找values/styles.xml,會看到

<resources>
    <style name="AppTheme" parent="android:Theme.Holo"/>        
</resources>

name屬性代表該style的名稱(必填)
parent屬性表示該style繼承自哪個theme(非必填)
此處繼承該theme卻又沒做修改,也就是直接使用該theme的意思


在程式中
使用context.setTheme(int resourceId)


Q2.如何讓元件套用style?

A2.
使用android:style屬性指定


Q3.如何在既有的Theme修改部分屬性?

A3.
於styles.xml中的<style>標籤中夾入<item>標籤

Ex:
    <style name="AppTheme" parent="android:Theme.Holo.Light.NoActionBar" >
        <item name="android:windowIsFloating">true</item>
        <item name="background">#123</item>
    </style>

要查有哪些屬性可用,可在Android Developer上查R.attr類別
window開頭的屬性專門用於theme


Q4.如何在不同的Android版本中套用不同的theme?

A4.
使用values資料夾的後綴指定版本號

Ex: 
values-v21
values-v17
values

三個資料夾裡都有styles.xml,只是裡面對於同一個name屬性的style所指定的parent屬性不同

API 21以上的系統就會套用values-v21裡指定的theme
API 17~20的系統就會套用values-v17裡指定的theme
API 16以下的系統就會套用values裡指定的theme 


如果Activity是繼承android.support.v7.app.ActionBarActivity時,該Activity必須使用appCompatv系列的Theme,若不想用,就改成繼承Activity,否則會出現例外

沒有留言:

張貼留言