Android 深色主題適配

Android10系統(tǒng)開(kāi)始,谷歌引入深色主題的特性,適配方案有兩種,第一種是自動(dòng)強(qiáng)制適配方案(Force Dark); 第二種是手動(dòng)適配方案(資源替換)。

  1. Force Dark:
    在res目錄下創(chuàng)建value-v29目錄并創(chuàng)建styles.xml文件,復(fù)制一份你app style進(jìn)去并添加<item name="android:forceDarkAllowed">true</item>,因?yàn)檫@個(gè)設(shè)置只能在Android系統(tǒng)10.0才能使用,所以不能直接設(shè)置在原來(lái)的app style,當(dāng)程序運(yùn)行在10.0以上系統(tǒng)才會(huì)讀取value-v29目錄。
<style name="AppTheme.NoActionBar">
       <!--標(biāo)題欄的顏色-->
        <item name="colorPrimary">@color/colorPrimary_xueHui</item>
        <!--狀態(tài)欄的顏色-->
        <item name="colorPrimaryDark">@color/colorPrimary_xueHui</item>
        <!--默認(rèn)的光標(biāo)、選中的RadioButton顏色-->
        <item name="colorAccent">@color/colorPrimary_xueHui</item>
         <item name="android:forceDarkAllowed">true</item>
    </style>

注意:
①. 如果使用的是 DayNight 或 Dark Theme 主題,則設(shè)置forceDarkAllowed 不生效。
②. 此種方案可能在深色主題顏色上會(huì)不盡人意,如果想在局部上排除適配的話可以對(duì)應(yīng)的view上設(shè)置forceDarkAllowed為false。

  1. 手動(dòng)適配方案:
    把你的app styles的parent指向DayNight主題,在這個(gè)主題下,開(kāi)發(fā)者沒(méi)有給控件顏色進(jìn)行硬編碼的話(沒(méi)有設(shè)置顏色固定值),系統(tǒng)就會(huì)自動(dòng)轉(zhuǎn)換深色主題,然后針對(duì)那些進(jìn)行了硬編碼的顏色適配就需要進(jìn)一步操作了,在res目錄下創(chuàng)建value-night目錄并創(chuàng)建colors.xml文件,然后在普通value目錄下的colors的需要適配的顏色都復(fù)制一份到value-night目錄下colors.xml并指定深色模式的具體顏色值,到這里就完成了,因?yàn)橄到y(tǒng)指定深色主題狀態(tài)下會(huì)讀取value-night目錄。


    image.png

代碼判斷深色主題是否開(kāi)啟

public static boolean isNightMode(Context context) {
    int currentNightMode = context.getResources().getConfiguration().uiMode & 
        Configuration.UI_MODE_NIGHT_MASK;
    return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
}

監(jiān)聽(tīng)深色主題是否開(kāi)啟

<activity
    android:name=".MyActivity"
    android:configChanges="uiMode" />
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    int currentNightMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;
    switch (currentNightMode) {
        case Configuration.UI_MODE_NIGHT_NO:
            // 關(guān)閉
            break;
        case Configuration.UI_MODE_NIGHT_YES:
            // 開(kāi)啟
            break;
        default:
            break;    
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容