您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Android怎么快速適配暗黑模式,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
public class DarkModeUtils { public static final String KEY_CURRENT_MODEL = "night_mode_state_sp"; private static int getNightModel(Context context) { SharedPreferences sp = context.getSharedPreferences(KEY_CURRENT_MODEL, Context.MODE_PRIVATE); return sp.getInt(KEY_CURRENT_MODEL, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } public static void setNightModel(Context context, int nightMode) { SharedPreferences sp = context.getSharedPreferences(KEY_CURRENT_MODEL, Context.MODE_PRIVATE); sp.edit().putInt(KEY_CURRENT_MODEL, nightMode).apply(); } /** * ths method should be called in Application onCreate method * * @param application application */ public static void init(Application application) { int nightMode = getNightModel(application); AppCompatDelegate.setDefaultNightMode(nightMode); } /** * 應用夜間模式 */ public static void applyNightMode(Context context) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); setNightModel(context, AppCompatDelegate.MODE_NIGHT_YES); } /** * 應用日間模式 */ public static void applyDayMode(Context context) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); setNightModel(context, AppCompatDelegate.MODE_NIGHT_NO); } /** * 跟隨系統主題時需要動態切換 */ public static void applySystemMode(Context context) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); setNightModel(context, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } /** * 判斷App當前是否處于暗黑模式狀態 * * @param context 上下文 * @return 返回 */ public static boolean isDarkMode(Context context) { int nightMode = getNightModel(context); if (nightMode == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) { int applicationUiMode = context.getResources().getConfiguration().uiMode; int systemMode = applicationUiMode & Configuration.UI_MODE_NIGHT_MASK; return systemMode == Configuration.UI_MODE_NIGHT_YES; } else { return nightMode == AppCompatDelegate.MODE_NIGHT_YES; } } }
很明顯這是切換暗黑模式的方法,在調用前必選先適配App的暗黑樣式。
如何適配
顏色資源
新建values-night文件夾,將頁面中使用的色值都替換成暗黑模式下的色值。
圖片資源
新建mipmap-night/drawable-night文件夾,將頁面中使用的圖片和樣式資源都替換成暗黑模式下的對應資源。
狀態欄
通過上方代碼中最后一個方法isDarkMode判斷顯示什么顏色的狀態欄。最好在BaseActivity中操作,否則Activity很多的話很麻煩。
調用
調用上方的方法切換App的暗黑模式。需要注意的點如下:
androidx上直接調用即可。support上使用并且在Activity中切換暗黑模式,需要動態調用一下activity.recreate()方法。具體原因看下面源碼:
androidx版本:
/** * Sets the default night mode. This is the default value used for all components, but can * be overridden locally via {@link #setLocalNightMode(int)}. * * <p>This is the primary method to control the DayNight functionality, since it allows * the delegates to avoid unnecessary recreations when possible.</p> * * <p>If this method is called after any host components with attached * {@link AppCompatDelegate}s have been 'started', a {@code uiMode} configuration change * will occur in each. This may result in those components being recreated, depending * on their manifest configuration.</p> * * <p>Defaults to {@link #MODE_NIGHT_FOLLOW_SYSTEM}.</p> * * @see #setLocalNightMode(int) * @see #getDefaultNightMode() */ public static void setDefaultNightMode(@NightMode int mode) { switch (mode) { case MODE_NIGHT_NO: case MODE_NIGHT_YES: case MODE_NIGHT_FOLLOW_SYSTEM: case MODE_NIGHT_AUTO_TIME: case MODE_NIGHT_AUTO_BATTERY: if (sDefaultNightMode != mode) { sDefaultNightMode = mode; applyDayNightToActiveDelegates(); } break; default: Log.d(TAG, "setDefaultNightMode() called with an unknown mode"); break; } }
support版本:
public static void setDefaultNightMode(int mode) { switch(mode) { case -1: case 0: case 1: case 2: sDefaultNightMode = mode; break; default: Log.d("AppCompatDelegate", "setDefaultNightMode() called with an unknown mode"); } }
對比后可以發現androidx切換暗黑模式后,自己主動調用了apply方法,使Activity重建。而support上沒有,僅僅是賦值而已。所以support版本上使用需要自己調用activity.recreate()方法。
關于“Android怎么快速適配暗黑模式”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。