Android中Theme主題和Style樣式使用介紹總結

一,Theme主題

1.1,Theme主題作用範圍

Theme主要是針對應用級別的或者說窗體級別,可以設置應用主題(應用換膚效果)或者Activity的主題;主題是不能應用在某一個單獨的View中;

1.2,Theme主題的定義

在AS中res/values/style.xml中定義,例如新建項目AS自動創建的Theme,是系統提供;

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
      <!-- Customize your theme here. -->
      <item name="colorPrimary">@color/colorPrimary</item>
      <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
      <item name="colorAccent">@color/colorAccent</item>
</style>

Android系統提供的主題在:..\platforms\android-29\data\res\values

常見的系統主題:(來自https://blog.csdn.net/oudetu/article/details/78568436

android:theme="@android:style/Theme.Dialog"   將一個Activity顯示爲能話框模式  

android:theme="@android:style/Theme.NoTitleBar"  不顯示應用程序標題欄  

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不顯示應用程序標題欄,並全屏

android:theme="Theme.Light"  背景爲白色  

android:theme="Theme.Light.NoTitleBar"  白色背景並無標題欄  

android:theme="Theme.Light.NoTitleBar.Fullscreen"  白色背景,無標題欄,全屏

android:theme="Theme.Black"  背景黑色  

android:theme="Theme.Black.NoTitleBar"  黑色背景並無標題欄

android:theme="Theme.Black.NoTitleBar.Fullscreen"    黑色背景,無標題欄,全屏

android:theme="Theme.Wallpaper"  用系統桌面爲應用程序背景  

android:theme="Theme.Wallpaper.NoTitleBar"  用系統桌面爲應用程序背景,且無標題欄  

android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"  用系統桌面爲應用程序背景,無標題欄,全屏  

android:theme="Translucent"  半透明  

android:theme="Theme.Translucent.NoTitleBar" 半透明、無標題欄  

android:theme="Theme.Translucent.NoTitleBar.Fullscreen" 半透明、無標題欄、全屏  

android:theme=”Theme.Panel” 半透明,無標題,全屏

android:theme=”Theme.Light.Panel”平板風格顯示

常見主題集合中的item屬性(來自:https://www.jianshu.com/p/06a3bbb7ce79

<!-- 應用的主要色調,actionBar默認使用該顏色,Toolbar導航欄的底色 -->
    <item name="colorPrimary">@color/white</item>
    <!-- 應用的主要暗色調,statusBarColor 默認使用該顏色 -->
    <item name="colorPrimaryDark">@color/white</item>
    <!-- 一般控件的選中效果默認採用該顏色,如 CheckBox,RadioButton,SwitchCompat,ProcessBar等-->
    <item name="colorAccent">@color/colorAccent</item>

    <!-- 狀態欄、頂部導航欄 相關-->
    <!-- status bar color -->
    <item name="android:statusBarColor">#00000000</item>
    <!-- activity 是否能在status bar 底部繪製 -->
    <item name="android:windowOverscan">true</item>
    <!-- 讓status bar透明,相當於statusBarColor=transparent + windowOverscan=true -->
    <item name="android:windowTranslucentStatus">true</item>
    <!-- 改變status bar 文字顏色, true黑色, false白色,API23可用-->
    <item name="android:windowLightStatusBar">true</item>
    <!-- 全屏顯示,隱藏狀態欄、導航欄、底部導航欄 -->
    <item name="android:windowFullscreen">true</item>
    <!-- hide title bar -->
    <item name="windowNoTitle">true</item>
    <!-- 底部虛擬導航欄顏色 -->
    <item name="android:navigationBarColor">#E91E63</item>
    <!-- 讓底部導航欄變半透明灰色,覆蓋在Activity之上(默認false,activity會居於底部導航欄頂部),如果設爲true,navigationBarColor 失效 -->
    <item name="android:windowTranslucentNavigation">true</item>

    <!-- WindowBackground,可以設置@drawable,顏色引用(@color),不能設置顏色值(#fffffff),
    Window區域說明:Window涵蓋整個屏幕顯示區域,包括StatusBar的區域。當windowOverscan=false時,window的區域比Activity多出StatusBar,當windowOverscan=true時,window區域與Activity相同-->
    <item name="android:windowBackground">@drawable/ic_launcher_background</item>
    <!--<item name="android:windowBackground">@color/light_purple</item>-->

    <!-- 控件相關 -->
    <!-- button 文字是否全部大寫(系統默認開)-->
    <item name="android:textAllCaps">false</item>

    <!-- 默認 Button,TextView的文字顏色 -->
    <item name="android:textColor">#B0C4DE</item>
    <!-- 默認 EditView 輸入框字體的顏色 -->
    <item name="android:editTextColor">#E6E6FA</item>
    <!-- RadioButton checkbox等控件的文字 -->
    <item name="android:textColorPrimaryDisableOnly">#1C71A9</item>
    <!-- 應用的主要文字顏色,actionBar的標題文字默認使用該顏色 -->
    <item name="android:textColorPrimary">#FFFFFF</item>
    <!-- 輔助的文字顏色,一般比textColorPrimary的顏色弱一點,用於一些弱化的表示 -->
    <item name="android:textColorSecondary">#C1C1C1</item>
    <!-- 控件選中時的顏色,默認使用colorAccent -->
    <item name="android:colorControlActivated">#FF7F50</item>
    <!-- 控件按壓時的色調-->
    <item name="android:colorControlHighlight">#FF00FF</item>
    <!-- CheckBox,RadioButton,SwitchCompat等默認狀態的顏色 -->
    <item name="android:colorControlNormal">#FFD700</item>
    <!-- 默認按鈕的背景顏色 -->
    <item name="android:colorButtonNormal">#1C71A9</item>

    <!-- 【無效】 在theme中設置Activity的屬性無效, 請到AndroidManifest中Activity標籤下設置 -->
    <item name="android:launchMode">singleTop</item>
    <item name="android:screenOrientation">landscape</item>

1.3,Theme主題的使用

在AndroidManifest.xml爲應用或者Activity設置theme,通過android:theme = "@style/theme主題名"來引入自己的主題

<application
        android:name=".MyApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:theme="@style/AppTheme.Launcher"> //自定義的Theme
</application>

在Java代碼中設置theme,注意在Activity的onCreate方法中的setContentView(R.layout.activity_main)之前設置;

setTheme(R.style.AppTheme);

自定義屬性 res/values/attrs.xml(通過:定義 賦值  使用)

二,style樣式

2.1,style樣式的使用範圍

style樣式是針對窗體元素級別的或者說View級別的,改變指定控件或者Layout的樣式。

2.2,style作用

抽取一些共同的屬性定義到style中,可以省略重複的屬性代碼。

2.3,定義

res/values/style.xml中新建<style>標籤,爲此標籤設置name屬性;如下

    <style name="myButtonStyle">
        <item name="android:height">?attr/myHeight</item>
        <item name="android:textColor">#0ff0f0</item>      <!--字體顏色-->
        <item name="android:textSize">15sp</item>          <!--字體大小-->
        <item name="android:layout_height">200dp</item>     <!--控件高度-->
        <item name="android:layout_width">match_parent</item>  <!--控件寬度-->
        <item name="android:background">#ff0000</item>         <!--背景色-->
    </style>

2.4,使用

在xml佈局文件中

<Button
        android:id="@+id/btn_style_test"
        style="@style/myButtonStyle"/>

三,區別

從Theme和style的作用範圍可以看出他們的區別;如果一個應用使用了theme,同時應用下的view也使用了style,那麼當theme與樣式style發生衝突時,style有效,因爲style的優先級高於theme;

四,相同點

都是在res/values/style.xml中定義;繼承方式也相同即:.繼承(只能繼承自定義)和parent繼承

五,相關

@符號:表明我們應用的資源是已經定義過並存在的,可以直接引用。
 ? 符號:表明我們引用的資源的值在當前的主題當中定義過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章