Android主題(theme)的一些總結

一替久、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

image.png

以上就是常見的系統(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有具體是哪里的顏色
咱在網上找了一個圖姑蓝,應該還是挺清晰的吧


image.png

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如下:


image.png

然后血崭,在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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末钻洒,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子锄开,更是在濱河造成了極大的恐慌素标,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萍悴,死亡現場離奇詭異头遭,居然都是意外死亡,警方通過查閱死者的電腦和手機癣诱,發(fā)現死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門计维,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撕予,你說我怎么就攤上這事鲫惶。” “怎么了实抡?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵剑按,是天一觀的道長。 經常有香客問我澜术,道長,這世上最難降的妖魔是什么猬腰? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任鸟废,我火速辦了婚禮,結果婚禮上姑荷,老公的妹妹穿的比我還像新娘盒延。我一直安慰自己,他們只是感情好鼠冕,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布添寺。 她就那樣靜靜地躺著,像睡著了一般懈费。 火紅的嫁衣襯著肌膚如雪计露。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天憎乙,我揣著相機與錄音票罐,去河邊找鬼。 笑死泞边,一個胖子當著我的面吹牛该押,可吹牛的內容都是我干的。 我是一名探鬼主播阵谚,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼蚕礼,長吁一口氣:“原來是場噩夢啊……” “哼烟具!你這毒婦竟也來了?” 一聲冷哼從身側響起奠蹬,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朝聋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罩润,有當地人在樹林里發(fā)現了一具尸體玖翅,經...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年割以,在試婚紗的時候發(fā)現自己被綠了金度。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡严沥,死狀恐怖猜极,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情消玄,我是刑警寧澤跟伏,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站翩瓜,受9級特大地震影響受扳,放射性物質發(fā)生泄漏。R本人自食惡果不足惜兔跌,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一勘高、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坟桅,春花似錦华望、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夸楣,卻和暖如春宾抓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豫喧。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工洞慎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘿棘。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓劲腿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸟妙。 傳聞我的和親對象是個殘疾皇子焦人,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容