Android夜間模式(多主題)探索

如果本文幫助到你蓖租,本人不勝榮幸,如果浪費了你的時間羊壹,本人深感抱歉蓖宦。
希望用最簡單的大白話來幫助那些像我一樣的人。如果有什么錯誤油猫,請一定指出稠茂,以免誤導(dǎo)大家、也誤導(dǎo)我情妖。
本文來自:http://www.reibang.com/users/320f9e8f7fc9/latest_articles
感謝您的關(guān)注睬关。

主題功能老早就想研究了,可是看了很多之后鲫售,發(fā)現(xiàn)想要很好的實現(xiàn)共螺,并沒有什么簡單的辦法。
但是如果要求不高情竹,實現(xiàn)起來還是挺簡單的藐不。
一起來看一下。


先說說簡單的實現(xiàn)步驟

  1. 在 styles.xml 中定義不同的主題風(fēng)格秦效;
  1. 在 attrs.xml 文件中雏蛮,定義自己的屬性;
  2. 在 layout 布局文件中阱州,使用 styles.xml 中定義的屬性挑秉;
  3. 在 Activity 中切換主題,就好了苔货。

然后來看每一步的詳細操作:

1. 在 styles.xml 中定義不同的主題風(fēng)格

也就是定義多種風(fēng)格的主題犀概,設(shè)置不同的顏色等。

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <!--Toolbar的背景顏色-->
        <item name="colorPrimary">@color/colorPrimary</item>
        <!--StatusBar的顏色-->
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <!--主標(biāo)題的字體顏色-->
        <item name="android:textColorPrimary">@color/textColorPrimary</item>
        <!--控制元件的默認狀態(tài)顏色-->
        <item name="android:colorControlNormal">@color/colorControlNormal</item>
        <!--控制元件在選中狀態(tài)的顏色-->
        <item name="colorAccent">@color/colorAccent</item>
        <!--Activity的背景顏色-->
        <item name="android:windowBackground">@color/windowBackground</item>
        <!--自定義的屬性-->
        <item name="Text_bg_Color">@color/Text_bg_Color</item>
    </style>

    <style name="AppThemeNight" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/NcolorPrimary</item>
        <item name="colorPrimaryDark">@color/NcolorPrimaryDark</item>
        <item name="android:textColorPrimary">@color/NtextColorPrimary</item>
        <item name="android:colorControlNormal">@color/NcolorControlNormal</item>
        <item name="colorAccent">@color/NcolorAccent</item>
        <item name="android:windowBackground">@color/NwindowBackground</item>
        <item name="Text_bg_Color">@color/NText_bg_Color</item>
    </style>
</resources>

大多時候夜惭,系統(tǒng)自帶的屬性并不夠用姻灶,所以就需要自定義一些屬性,比如說上面的最后一個屬性诈茧。
自定義方法如下

2. 在 attrs.xml 文件中产喉,定義自己的屬性

在values文件夾下,新建attrs.xml文件,定義自己的屬性曾沈。

<resources>
    <attr name="Text_bg_Color" format="color"/>
</resources>

3. 在 layout 布局文件中这嚣,使用 styles.xml 中定義的屬性

布局文件中,在需要改變色調(diào)的位置塞俱,設(shè)置相應(yīng)的屬性姐帚。

布局文件

4. 最后一步,在 Activity 中切換主題

public class MainActivity extends AppCompatActivity {

    /**
     * recreate() 會使 Activity 重新刷新敛腌,所以 這個標(biāo)志必須是靜態(tài)的卧土。
     */
    private static boolean night = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        changeTheme();
        setContentView(R.layout.activity_main);

        findViewById(R.id.email_sign_in_button).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                change();
            }
        });
    }

    private void change() {
        night = !night;
        changeTheme();
        recreate();// 重啟 Activity
    }

    /**
     * 根據(jù)標(biāo)志改變主題
     */
    private void changeTheme() {
        if (night) {
            setTheme(R.style.AppThemeNight);
        } else {
            setTheme(R.style.AppTheme);
        }
    }
}

到此,就可以實現(xiàn)一個最基本的切換主題了像樊,這樣也是會有一個問題尤莺,也就是閃屏。
但是如果要求不是很高生棍,這也是可以滿足需求的颤霎。
此項目代碼:
https://github.com/Wing-Li/AndroidPractice/tree/master/ThemeChange


閃屏也是大家想盡各種辦法想要解決的一個問題。

在此寫下大家解決的思路涂滴。

目前思路是:
  1. 利用 setTheme(); 改變主題友酱;
  2. 用 recreate() 刷新當(dāng)前Activity,主題就改變了柔纵。
解決閃屏辦法:

不再使用 setTheme();
而是將當(dāng)前 Activity 上的每個控件缔杉,分別改成自己設(shè)定的顏色。

對搁料,沒錯或详,就是修改每個控件。
各種解決辦法郭计,也就是看使用什么辦法可以更方便的修改多個控件霸琴。


找到了兩個切換主題的框架,從源碼中很明顯的可以看出昭伸,他們都是把常用的基本控件重寫的一遍梧乘,而我們要使用這個框架的時候,也必須使用框架所提供的控件庐杨。

當(dāng)調(diào)用了切換主題的方法后选调,會遍歷使用的控件修改相應(yīng)的顏色,從而達到 不閃屏切換主題的效果灵份。

https://github.com/Bilibili/MagicaSakura

MagicaSakura

https://github.com/dersoncheng/MultipleTheme

MultipleTheme

<br />
如果是有多個主題仁堪,用框架實現(xiàn)還能接受,畢竟很麻煩各吨。
但是如果僅僅只是要實現(xiàn)夜間模式枝笨,就使用個框架還是不太舒服,而且必須要使用框架帶的基本控件揭蜒。

所以還是有一些其他的方式横浑,目的還是那句話:使用更好的方式修改多個控件的顏色。
這篇文章介紹的方法屉更,感覺不錯:知乎和簡書的夜間模式實現(xiàn)套路
前面都大同小異徙融,主要是修改顏色的那一段代碼。

將其項目提煉后瑰谜,只剩修與修改主題相關(guān)代碼:
https://github.com/Wing-Li/AndroidPractice/tree/master/SeamlessChangeTheme

<br />
好了欺冀,本文就分享到這里。
如果有什么更好的方式萨脑,請一定告知隐轩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市渤早,隨后出現(xiàn)的幾起案子职车,更是在濱河造成了極大的恐慌,老刑警劉巖鹊杖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悴灵,死亡現(xiàn)場離奇詭異,居然都是意外死亡骂蓖,警方通過查閱死者的電腦和手機积瞒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來登下,“玉大人茫孔,你說我怎么就攤上這事÷” “怎么了银酬?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長筐钟。 經(jīng)常有香客問我揩瞪,道長,這世上最難降的妖魔是什么篓冲? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任李破,我火速辦了婚禮,結(jié)果婚禮上壹将,老公的妹妹穿的比我還像新娘嗤攻。我一直安慰自己,他們只是感情好诽俯,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布妇菱。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闯团。 梳的紋絲不亂的頭發(fā)上辛臊,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音房交,去河邊找鬼彻舰。 笑死,一個胖子當(dāng)著我的面吹牛候味,可吹牛的內(nèi)容都是我干的刃唤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼白群,長吁一口氣:“原來是場噩夢啊……” “哼尚胞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起帜慢,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辐真,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后崖堤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侍咱,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年密幔,在試婚紗的時候發(fā)現(xiàn)自己被綠了楔脯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡胯甩,死狀恐怖昧廷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偎箫,我是刑警寧澤木柬,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站淹办,受9級特大地震影響眉枕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怜森,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一速挑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧副硅,春花似錦姥宝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽套么。三九已至,卻和暖如春碳蛋,著一層夾襖步出監(jiān)牢的瞬間违诗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工疮蹦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茸炒。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓愕乎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壁公。 傳聞我的和親對象是個殘疾皇子感论,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,290評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件紊册、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,120評論 4 61
  • swift 中的閉包類似于 OC 中的 Block比肄,但是使用比 Block 更廣泛 閉包的簡單說明 保存提前準(zhǔn)備好...
    BWLi420閱讀 402評論 0 2
  • 姑娘可真水靈,富貴小子挺有福氣啊囊陡。 我說王嬸兒我叫小木芳绩,她叫伽伽,富貴的朋友撞反。我邊說邊拿手指了指富貴妥色。 可惜了了乔妈,...
    林四月閱讀 628評論 0 1
  • 有些人是可以真心做朋友的绪氛,有些人是說說廢話就足以的练慕,而有些人是連廢話都不用說的判呕。 ???
    Shealy222閱讀 169評論 0 0