android-樣式(style)和主題(theme)

     若是咱們常常須要對某個類型的組件指定大體類似的格式,好比字體、顏色、背景色等,若是每次都對view組件重複設置這些屬性,這無疑增大了工做量,並且不利於項目的後期維護。css

    其實android裏面的style有點相似css,若是有網站開發經驗的同窗,來理解style來講,是比較好理解的。java

樣式資源android

    Android的樣式資源文件也放在/res/values目錄下,樣式資源文件的根元素是<resource.../>元素,並且在<resource../>中又能夠包括多個<style.../>子元素,每一個<style../>元素定義一個樣式。style元素定義有如下屬性:
app

    

name : 指定樣式的名稱
parent :指定樣式所繼承的父樣式,當繼承某個父樣式時,該樣式將具備父樣式中定義的全部格式。固然,當前樣式也能夠覆蓋父樣式中的格式。
<style.../>元素內能夠包含多個<item.../>子元素,每一個<item.../>子元素定義一個格式項

  例如以下實例: ide

<?xml version="1.0" encodig="utf-8"?>
<resource>
    <style name="style1">
        <item name="android:textSize">20sp</item>
        <item name="android:textColor">#00d</item>
    </style>
    <style name="style2" parent="style1">
        <item name="android:background">#ee6</item>
        <item name="android:padding">8dp</item>
        <!--覆蓋父樣式中指定的屬性-->
        <item name="android:textColor">#000</item>
    </style>
</resource>

上面的樣式資源中定義了兩個樣式,其中第二個樣式繼承了第一個樣式,並且第二個樣式中的textColor屬性覆蓋了父樣式中的textColor屬性。佈局

一旦定義了上面的樣式資源後,接下來就能夠在XML資源中按照以下語法格式來使用樣式了:字體

@[<package_name>]style/file_name

下面是該實例中的界面佈局文件,該佈局文件中包含兩個文本框,這兩個文本框分別使用兩個樣式。網站

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/style1"
        android:text="@string/style1"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/style2"
        android:text="@string/style2"/>
</LinearLayout>

上面的界面佈局文件中,並未爲兩個文本框指定恩和格式,只是爲他們分別指定了使用style1.style2的樣式,這兩個樣式包含的格式就會應用到這兩個文本框。spa

主題資源code

與樣式資源很是類似,主題資源xml文件一般也放在res/values目錄下,主題資源的XML文檔一樣以<resource.../>元素做爲根元素,一樣使用<style.../>元素來定義主題。

主題和樣式的區別體如今:

  • 主題不能做用於單個的View組件,主體應該對整個應用綜的全部Activity起做用,或對指定的Activity起做用

  • 主題定義的格式應該是改變窗口外觀的格式,例如窗口標題。窗口邊框等

實例:給全部窗口添加邊框、背景                                                                                                                                   

下面經過一個實例來介紹主題的用法。爲了給全部窗口添加邊框、背景、先在/res/values/my_style.xml文件中添加一個主題,定義主體的<style.../>片斷以下:

<?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="Crazy_theme">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowFrame">@drawable/abc_btn_check_material</item>
        <item name="android:windowBackground">@drawable/abc_btn_check_to_on_mtrl_015</item>
    </style>
</resources>

定義了上面的主題以後,接下來就能夠在Java代碼中使用這個主題了,例如

public class MainActivity extends Activity{
    private ListView listView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.Crazy_theme);
        setContentView(R.layout.activity_main);
    }
}

大部分時候,在AndroidManifest.xml文件中對指定應用、Activity應用主題更加簡單。若是咱們想讓應用的所有窗體使用該主題,只要爲<application.../>元素添加android:theme屬性,屬性值是一個主題的名字,以下代碼所示:

<application android:theme="@style/CrazyitTheme">
...
</application>

若是你指向讓程序中的某個activity擁有這個主題,那麼你能夠修改成<activity.../>元素,一樣android:theme指定主題便可。

本應用在AndroidManifest.xml文件的<application../>元素中添加了android:theme="@style/CrazyTheme"屬性。

Android中提供了幾種內置的主題資源,這些主題經過查詢Android.R.style類能夠看到。

與樣式相似的是,Android主題一樣支持繼承。若是開發過程當中還想利用某個主題,但須要對他進行局部修改,則可經過繼承系統主題來實現自定義主題。例如以下代碼片斷:

<style name="CrazyTheme" parent="@android:style/Theme.Dialog">
...
</style>

上面定義的CrazyTheme主題繼承了android.R.style.Theme.Dialog主題,那麼接下來在該<style.../>元素中添加的<item.../>子元素可覆蓋系統主題的部分屬性了

相關文章
相關標籤/搜索