如何以编程方式启用夜间模式?
How to enable night mode programmatically?
我正在寻找一种使用 Android 代码以编程方式启用夜间模式的方法:
public static void setNightMode(Context target, boolean state){
UiModeManager uiManager = (UiModeManager) target.getSystemService(Context.UI_MODE_SERVICE);
if (state) {
//uiManager.enableCarMode(0);
uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
} else {
// uiManager.disableCarMode(0);
uiManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
}
}
我的屏幕上没有任何变化,夜间模式仍处于禁用状态。
根据这个link
无需启用carMode或deskMode。
我在 Android Studio 上有以下 logcat:
11-26 12:15:16.662 3823-3823/? D/UiModeManager: updateConfigurationLocked: mDockState=0; mCarMode=false; mNightMode=2; uiMode=33
11-26 12:15:26.802 3823-3823/? V/UiModeManager: updateLocked: null action, mDockState=0, category=null
NightOwl 有自己的实现,用于在 Android 上切换 day/night 模式。 NightOwl 入门超级简单。这是一个代码片段:
在应用程序中初始化 NightOwl class,
NightOwl.builder().defaultMode(0).create();
在您的 Activity class,
中调用三个方法
public class DemoActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// step1 before super.onCreate
NightOwl.owlBeforeCreate(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
// step2 after setContentView
NightOwl.owlAfterCreate(this);
// write your code
}
@Override
protected void onResume() {
super.onResume();
// step3 onResume
NightOwl.owlResume(this);
}
}
随心所欲切换皮肤,
View v = findViewById(R.id.button);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NightOwl.owlNewDress(SettingActivity.this);
}
});
确保在 styles.xml 文件中将默认主题从 Theme.AppCompat.Light.DarkActionBar
更改为 Theme.AppCompat.DayNight.DarkActionBar
,然后执行 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
切换到夜间模式。我已经在 APIv23(Android 6.0) 及更高版本中对其进行了测试,并且工作正常。
有关更好的解释,请参阅 this codelab by Android
最简单的解决方案
您可以 enable/disable 应用程序的深色主题,只需:
启用深色主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
强制禁用深色主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
根据移动设备设置的深色模式设置应用主题,即如果启用了深色模式,则主题将设置为深色主题,否则将设置为深色主题
默认主题,但这只适用于 version >= Android version Q (10)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
备注:
- 您 app/activity 的基本主题应该是
"Theme.AppCompat.DayNight"
喜欢
<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
- 您的 res 文件夹的名称将以 -night 结尾,这样您就可以为日夜主题设置不同的颜色和图像,例如
drawable & drawable-night,
价值与价值之夜
这段代码对我来说工作得很好,但您可能只需要重新启动您的应用程序。但请记住,此代码 在系统范围内启用深色模式 ,而不仅仅是在应用程序中:
public static void setNightMode(Context target , boolean state){
UiModeManager uiManager = (UiModeManager) target.getSystemService(Context.UI_MODE_SERVICE);
if (VERSION.SDK_INT <= 22) {
uiManager.enableCarMode(0);
}
if (state) {
uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
} else {
uiManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
}
}
这在 Kitkat 中对我有用。
请记住 Dark Mode
不是 Night Mode
。他们是完全不同的。 DM 是在 Android 10 中引入的,它强制执行内置的黑白颜色,而 NM 在早期版本中使用 default/custom 样式,具体取决于您的实现。如果您希望您的应用使用您的自定义 light/night 样式而不依赖于 Android 的内置深色样式,您可能需要将 forceDarkAllowed
设置为 false
themes.xml 或 style.xml 因为它可能与 DM 冲突。
要将您的应用程序模式更改为夜间,请使用 AppCompatDelegate。
// This will be the top level handling of theme
AppCompatDelegate.setDefaultNightMode(
if (userPrefModeIsNight)
AppCompatDelegate.MODE_NIGHT_YES
else
AppCompatDelegate.MODE_NIGHT_NO)
还有一件事:您的 Activity 需要从 AppCompatActivity 扩展。
如果它扩展了普通 Activity,那么调用 AppCompatDelegate.setDefaultNightMode 将不起作用。
我正在寻找一种使用 Android 代码以编程方式启用夜间模式的方法:
public static void setNightMode(Context target, boolean state){
UiModeManager uiManager = (UiModeManager) target.getSystemService(Context.UI_MODE_SERVICE);
if (state) {
//uiManager.enableCarMode(0);
uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
} else {
// uiManager.disableCarMode(0);
uiManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
}
}
我的屏幕上没有任何变化,夜间模式仍处于禁用状态。 根据这个link
无需启用carMode或deskMode。 我在 Android Studio 上有以下 logcat:
11-26 12:15:16.662 3823-3823/? D/UiModeManager: updateConfigurationLocked: mDockState=0; mCarMode=false; mNightMode=2; uiMode=33
11-26 12:15:26.802 3823-3823/? V/UiModeManager: updateLocked: null action, mDockState=0, category=null
NightOwl 有自己的实现,用于在 Android 上切换 day/night 模式。 NightOwl 入门超级简单。这是一个代码片段:
在应用程序中初始化 NightOwl class,
NightOwl.builder().defaultMode(0).create();
在您的 Activity class,
中调用三个方法public class DemoActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// step1 before super.onCreate
NightOwl.owlBeforeCreate(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
// step2 after setContentView
NightOwl.owlAfterCreate(this);
// write your code
}
@Override
protected void onResume() {
super.onResume();
// step3 onResume
NightOwl.owlResume(this);
}
}
随心所欲切换皮肤,
View v = findViewById(R.id.button);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NightOwl.owlNewDress(SettingActivity.this);
}
});
确保在 styles.xml 文件中将默认主题从 Theme.AppCompat.Light.DarkActionBar
更改为 Theme.AppCompat.DayNight.DarkActionBar
,然后执行 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
切换到夜间模式。我已经在 APIv23(Android 6.0) 及更高版本中对其进行了测试,并且工作正常。
有关更好的解释,请参阅 this codelab by Android
最简单的解决方案
您可以 enable/disable 应用程序的深色主题,只需:
启用深色主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
强制禁用深色主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
根据移动设备设置的深色模式设置应用主题,即如果启用了深色模式,则主题将设置为深色主题,否则将设置为深色主题 默认主题,但这只适用于 version >= Android version Q (10)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
备注:
- 您 app/activity 的基本主题应该是
"Theme.AppCompat.DayNight"
喜欢
<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
- 您的 res 文件夹的名称将以 -night 结尾,这样您就可以为日夜主题设置不同的颜色和图像,例如
drawable & drawable-night,
价值与价值之夜
这段代码对我来说工作得很好,但您可能只需要重新启动您的应用程序。但请记住,此代码 在系统范围内启用深色模式 ,而不仅仅是在应用程序中:
public static void setNightMode(Context target , boolean state){
UiModeManager uiManager = (UiModeManager) target.getSystemService(Context.UI_MODE_SERVICE);
if (VERSION.SDK_INT <= 22) {
uiManager.enableCarMode(0);
}
if (state) {
uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
} else {
uiManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
}
}
这在 Kitkat 中对我有用。
请记住 Dark Mode
不是 Night Mode
。他们是完全不同的。 DM 是在 Android 10 中引入的,它强制执行内置的黑白颜色,而 NM 在早期版本中使用 default/custom 样式,具体取决于您的实现。如果您希望您的应用使用您的自定义 light/night 样式而不依赖于 Android 的内置深色样式,您可能需要将 forceDarkAllowed
设置为 false
themes.xml 或 style.xml 因为它可能与 DM 冲突。
要将您的应用程序模式更改为夜间,请使用 AppCompatDelegate。
// This will be the top level handling of theme
AppCompatDelegate.setDefaultNightMode(
if (userPrefModeIsNight)
AppCompatDelegate.MODE_NIGHT_YES
else
AppCompatDelegate.MODE_NIGHT_NO)
还有一件事:您的 Activity 需要从 AppCompatActivity 扩展。
如果它扩展了普通 Activity,那么调用 AppCompatDelegate.setDefaultNightMode 将不起作用。