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