一,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繼承
五,相關
@符號:表明我們應用的資源是已經定義過並存在的,可以直接引用。
? 符號:表明我們引用的資源的值在當前的主題當中定義過。