一替久、theme主題
1.1是個啥葬燎?
theme 是我們應用的一個主題,或者是一種風格宪萄,比如我們穿衣服一套休閑裝或者一套運動裝,我們對其進行設置就可以更變咱們這個應用的相關皮膚(就像lol或者王者里面的皮膚一樣)酱虎。一般它是作用于整個應用的對應的是咱們的application雨膨,但是有時候部分的界面需要特殊的處理比如一個特定的activity,設置一個單獨的皮膚读串。
1.2在哪里設置聊记?
首先我們可以看看咱們的manife文件中,application的配置中:
<application
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.mytheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</paalication>
我們可以看到上面的配置文件中分別從兩個地方設置了主題:
1.application中設置恢暖,這個就是全局的排监,如果你不再單獨的重新為你要設置的activity設置一個主題,那么這個activity的主題就是“@style/AppTheme”這個主題
2.activity中設置杰捂,可以看到MainActivity這個activity就被單獨的設置了一個主題為:@style/AppTheme.mytheme
所以主題的作用域就是application跟activity舆床,不涉及到咱們的View
當然了有同學就會問,我不想在xml中設置嫁佳,用代碼設置挨队,當然也可以,如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(android.R.style.mytheme);
setContentView(R.layout.activity_main);
}
這里唯一需要注意的就是蒿往,我們設置的時候要在setContentView之前設置
1.3常見的系統(tǒng)主題展示盛垦,以及內部屬性?
常見的系統(tǒng)主題:(來自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" 用系統(tǒng)桌面為應用程序背景
android:theme="Theme.Wallpaper.NoTitleBar" 用系統(tǒng)桌面為應用程序背景班利,且無標題欄
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" 用系統(tǒng)桌面為應用程序背景,無標題欄榨呆,全屏
android:theme="Translucent" 半透明
android:theme="Theme.Translucent.NoTitleBar" 半透明罗标、無標題欄
android:theme="Theme.Translucent.NoTitleBar.Fullscreen" 半透明、無標題欄积蜻、全屏
android:theme=”Theme.Panel” 半透明馒稍,無標題,全屏
android:theme=”Theme.Light.Panel”平板風格顯示
下面還有被人整理的表格:(來自:https://menxindiaolong.blog.csdn.net/article/details/86561559)
以上就是常見的系統(tǒng)主題浅侨,我們可以直接用,有這么多的主題证膨,那么怎么樣才是我們要的呢如输?往下看
1.4我們自己想定義個我們自己的主題呢?
首先我們要在哪里定義央勒?
定義那些屬性不见?
那些屬性對應界面那些位置?
1.首先我們要找到資源文件下的路徑 在res/values/style.xml 中定義一個自己要的主題
<style name="MyTheme" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowContentOverlay">@null</item>
</style>
這里的MyTheme就可以在需要用的地方來使用了
好多屬性啊崔步,都是個啥意思呢稳吮?如下常用屬性:(來自:http://www.reibang.com/p/06a3bbb7ce79)
<style name="AppThemeDemo" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- 應用的主要色調,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>
<!-- 狀態(tài)欄灶似、頂部導航欄 相關-->
<!-- 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>
<!-- 全屏顯示者甲,隱藏狀態(tài)欄春感、導航欄、底部導航欄 -->
<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區(qū)域說明:Window涵蓋整個屏幕顯示區(qū)域竟纳,包括StatusBar的區(qū)域。當windowOverscan=false時疚鲤,window的區(qū)域比Activity多出StatusBar锥累,當windowOverscan=true時,window區(qū)域與Activity相同-->
<item name="android:windowBackground">@drawable/ic_launcher_background</item>
<!--<item name="android:windowBackground">@color/light_purple</item>-->
<!-- 控件相關 -->
<!-- button 文字是否全部大寫(系統(tǒng)默認開)-->
<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等默認狀態(tài)的顏色 -->
<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>
</style>
上面的屬性基本咱們使用的時候已經夠了诲宇,有同學還是不太清楚际歼,比如那個colorAccent具體是啥,colorPrimary有具體是哪里的顏色
咱在網上找了一個圖姑蓝,應該還是挺清晰的吧
1.5 自定義的一些主題屬性鹅心?
有時候我們的需求會涉及到那些android原生沒有提供的主題樣式,這個時候就需要我們自己定義纺荧,
舉個例子旭愧,有個activity名字叫D里面我們有個三個TextView,不同的入口進入的時候(例如:A宙暇,B输枯,C三個不同的Activity),D中的這個三個TextView占贫,x 桃熄、y、z要顯示不同的字體顏色
當然了型奥,有同學會說我們可以在進去D這個Activity之后對字體進行顏色設置瞳收,這里是舉一個簡單的例子,(萬一這個應用中有20個Activity,需要通過不同的入口顯示不同的字體顏色桩引,你還每個Activity進入之后缎讼,獲取控件TextView,再一個個setTextColor么)
首先坑匠,咱們來自定義一個屬性,在res路徑下創(chuàng)建個資源文件attr.xml如下:
然后血崭,在attr.xml中定義三個屬性分別對應這三個TextView的字體顏色,如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="myTextColor1" format="color"/>
<attr name="myTextColor2" format="color"/>
<attr name="myTextColor3" format="color"/>
</resources>
下一步厘灼,咱們在需要切換TextView顏色的activity定義咱們自己的主題theme
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme1" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowContentOverlay">@null</item>
<item name="myTextColor1">@color/color1</item>
<item name="myTextColor2">@color/color1</item>
<item name="myTextColor3">@color/color1</item>
</style>
<style name="MyTheme2" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowContentOverlay">@null</item>
<item name="myTextColor1">@color/color2</item>
<item name="myTextColor2">@color/color2</item>
<item name="myTextColor3">@color/color2</item>
</style>
以此類推定義 MyTheme3
</resources>
接下來我們在activity的布局文件中設置TextView的屬性
<TextView
android:id="@+id/tv_text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/myTextColor1"
android:textSize="16sp"
/>
<TextView
android:id="@+id/tv_text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/myTextColor2"
android:textSize="16sp"
/>
<TextView
android:id="@+id/tv_text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/myTextColor3"
android:textSize="16sp"
/>
然后咱們再在不同地方進入D這個Activity的時候加上判斷夹纫,不同的入口顯示不同的樣式
onCreate方法中判斷
//切換不同的風格,必須在setContentView之前做
swith(themeType){
case 1:
setTheme(R.style,MyTheme1);
break;
case 2:
setTheme(R.style,MyTheme2);
break;
............
setContentView(R.layout.activity_main);
當然了這些都是Theme的一些延伸设凹,實際的應用過程中舰讹,有些應用會用到一些實時換皮膚的效果,比如網易云音樂闪朱,項目級的會有更好的方法來實現
1.6 關于應用換膚的延伸月匣?
這個博主寫的很詳細
http://www.reibang.com/p/af7c0585dd5b