如何检测系统是否使用暗模式?
How to detect if system using dark mode?
我正在使用这个简单的功能来获得深色模式。我在共享首选项中存储一个布尔值。如果值不存在,我默认为 return false。
这是我的简单代码:
public static boolean getNightMode(){
SharedPreferences pref = getApplicationContext().getSharedPreferences("nightMode", 0);
return pref.getBoolean("nightMode",false);
}
现在我不想 return 默认为 false,我想 return 系统暗模式状态。
我的意思是如果系统使用深色模式,return 正确。
我怎样才能做到这一点?
您可以使用配置设置。
int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
// Night mode is not active, we're using the light theme
break;
case Configuration.UI_MODE_NIGHT_YES:
// Night mode is active, we're using dark theme
break;
}
详情请参考developer site。
科特林:
val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme
Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme
}
我在我的设置 activity 中创建了 2 个切换开关,所以一个偏好表示是使用系统设置(即暗或亮)还是覆盖。然后如果它被设置为覆盖,那么我检查第二个偏好以查看用户是否想要暗模式或亮模式。
root_preference.xml
<SwitchPreference
app:key="@string/displayMode"
app:title="Dark/Light Mode"
app:summaryOn="Manual"
app:summaryOff="Same As System"
app:defaultValue="false" />
<SwitchPreference
app:dependency="@string/displayMode"
app:key="@string/overideMode"
app:title="Select Theme"
app:summaryOn="Dark Mode"
app:summaryOff="Light Mode"/>
MainActivity.java(在 onCreate 中)
SharedPreferences userPref = androidx.preference.PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
//Use preference to set night or light mode
if(userPref.getBoolean(getString(R.string.displayMode),false)){
if(userPref.getBoolean(getString(R.string.overideMode), true)){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
}else{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}
要检测“系统”是否处于黑暗模式,您可以使用 getNightMode() 方法 UiModeManager class.
https://developer.android.com/reference/android/app/UiModeManager#getNightMode()
像这样,
UiModeManager uiModeManager = (UiModeManager) context.getSystemService(Context.UI_MODE_SERVICE);
int mode = uiModeManager.getNightMode();
if (mode == UiModeManager.MODE_NIGHT_YES) {
// System is in Night mode
} else if (mode == UiModeManager.MODE_NIGHT_NO) {
// System is in Day mode
}
如果想知道“您的应用”是否处于夜间模式,请参考@Lazy Ninja 的回答。
我正在使用这个简单的功能来获得深色模式。我在共享首选项中存储一个布尔值。如果值不存在,我默认为 return false。
这是我的简单代码:
public static boolean getNightMode(){
SharedPreferences pref = getApplicationContext().getSharedPreferences("nightMode", 0);
return pref.getBoolean("nightMode",false);
}
现在我不想 return 默认为 false,我想 return 系统暗模式状态。
我的意思是如果系统使用深色模式,return 正确。
我怎样才能做到这一点?
您可以使用配置设置。
int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
// Night mode is not active, we're using the light theme
break;
case Configuration.UI_MODE_NIGHT_YES:
// Night mode is active, we're using dark theme
break;
}
详情请参考developer site。
科特林:
val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme
Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme
}
我在我的设置 activity 中创建了 2 个切换开关,所以一个偏好表示是使用系统设置(即暗或亮)还是覆盖。然后如果它被设置为覆盖,那么我检查第二个偏好以查看用户是否想要暗模式或亮模式。
root_preference.xml
<SwitchPreference
app:key="@string/displayMode"
app:title="Dark/Light Mode"
app:summaryOn="Manual"
app:summaryOff="Same As System"
app:defaultValue="false" />
<SwitchPreference
app:dependency="@string/displayMode"
app:key="@string/overideMode"
app:title="Select Theme"
app:summaryOn="Dark Mode"
app:summaryOff="Light Mode"/>
MainActivity.java(在 onCreate 中)
SharedPreferences userPref = androidx.preference.PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
//Use preference to set night or light mode
if(userPref.getBoolean(getString(R.string.displayMode),false)){
if(userPref.getBoolean(getString(R.string.overideMode), true)){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
}else{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}
要检测“系统”是否处于黑暗模式,您可以使用 getNightMode() 方法 UiModeManager class.
https://developer.android.com/reference/android/app/UiModeManager#getNightMode()
像这样,
UiModeManager uiModeManager = (UiModeManager) context.getSystemService(Context.UI_MODE_SERVICE);
int mode = uiModeManager.getNightMode();
if (mode == UiModeManager.MODE_NIGHT_YES) {
// System is in Night mode
} else if (mode == UiModeManager.MODE_NIGHT_NO) {
// System is in Day mode
}
如果想知道“您的应用”是否处于夜间模式,请参考@Lazy Ninja 的回答。