android 快速實現夜間模式
最近專案中遇到了一個問題,夜間模式在8.0以上的手機中不起作用,查看了一下原因,是夜間模式實現方法的問題。分兩種情況介紹一下
先看一下執行效果:
第一種 是目前專案中用到的,是以前的開發人員寫的,存在一些問題(不相容8.0以上的版本),已解決
第二種是Support Library 中自帶的一種方法。
第一種:
第一步 需要新增夜間模式資源,以-night為字尾
日間模式 對應 夜間模式
drawable drawable-night
values values-night
drawable-hdpi drawable-night-hdpi
。。。
目錄結構如下:
例如:color 的色值:在不同的value 下,命名相同,但是色值可以隨意設定,適應不同的模式
圖片,邊框樣式等也是一樣的道理。
第二步 在application 中新增 切換方法:
public class MyApplication extends Application { private static Resources sRes; @Override public void onCreate() { super.onCreate(); init(this); } public static void init(Context context) { sRes = context.getResources(); } /** * 切換 夜間模式 * @param on true 夜間, false 日間 */ public static void updateNightMode(boolean on) { DisplayMetrics dm = sRes.getDisplayMetrics(); Configuration config = sRes.getConfiguration(); config.uiMode &= ~Configuration.UI_MODE_NIGHT_MASK; config.uiMode |= on ? Configuration.UI_MODE_NIGHT_YES : Configuration.UI_MODE_NIGHT_NO; sRes.updateConfiguration(config, dm); } }
第三步 呼叫方法修改主題:
MyApplication.updateNightMode( false/true ); // 需要儲存當前主題的狀態。根據狀態,進行切換
切換完後 重新整理
recreate();// 會有閃屏,可以使用下面的方法
或者
finish();
startActivity(new Intent( this, this.getClass()));
overridePendingTransition(0, 0);
注意:以上方法只適合 8.0以下的手機,需要相容的話,就需要用到第二種方法了
第二種:
使用Support Library 23.2中新新增的夜間模式主題,並且可以向下相容最低api 14的,基本滿足絕大多數的手機。
介紹:
設定 當前的模式
AppCompatDelegate.setDefaultNightMode(int mode);
它有四個可選值,分別是:
MODE_NIGHT_NO: 使用亮色(light)主題,不使用夜間模式
MODE_NIGHT_YES:使用暗色(dark)主題,使用夜間模式
MODE_NIGHT_AUTO:根據當前時間自動切換 亮色(light)/暗色(dark)主題
MODE_NIGHT_FOLLOW_SYSTEM(預設選項):設定為跟隨系統,通常為 MODE_NIGHT_NO
使用方法:
這種夜間模式只需要按照以下幾部就可以使用了:
第一步:
新增夜間模式目錄,和第一種方法的第一步一致
第二步:
需要 com.android.support:appcompat 23.2及以上的版本
及 在app 的bulid.gradle 中新增(一般建立專案的時候會自動新增):
dependencies {
implementation 'com.android.support:appcompat-v7:27.1.1'
}
第三步:
Activity須繼承AppCompatActivity (一定要繼承,否則無效)
第四步:
在 values—>styles.xml 中 修改你的主題樣式,將你的主題 parent 改為 Theme.AppCompat.DayNight 或者 它的子類
如: Theme.AppCompat.DayNight.NoActionBar
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorAccent">@color/colorAccent</item>
</style>
第四步:
切換主題
建議在application onCreate 中切換,
AppCompatDelegate.setDefaultNightMode(int mode);
注意:主題的當前模式 ,需要儲存到本地( 可以通過SharePreference),程式碼中還獲取不到當前的模式