我正在寻找一种使用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
感谢您的帮助。
答案 0 :(得分:13)
最简单的解决方案
您可以通过以下方式启用/禁用深色主题:
启用深色主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
强制禁用深色主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
根据暗模式的移动设置来设置应用主题,即,如果启用了暗模式,则该主题将设置为暗主题;如果未启用,则 默认主题,但这仅适用于版本> = Android版本Q
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
注释:
“ Theme.AppCompat.DayNight”
喜欢
<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
可绘制和可绘制的夜晚,
价值观与价值观之夜
答案 1 :(得分:1)
NightOwl有自己的实现,用于在Android上切换日/夜模式。 NightOwl入门非常简单。这是一段代码:
在Application类中初始化NightOwl,
NightOwl.builder().defaultMode(0).create();
在Activity类中调用三个方法
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);
}
});
答案 2 :(得分:1)
这段代码非常适合我,尽管您可能只需要重新启动应用程序。但请记住,此代码在系统范围内启用暗模式,而不仅仅是在应用中:
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 中对我有用。
答案 3 :(得分:0)
确保在 styles.xml 文件中将默认主题从Theme.AppCompat.Light.DarkActionBar
更改为Theme.AppCompat.DayNight.DarkActionBar
,然后执行AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
切换到夜间模式。我已经在APIv23(Android 6.0)及更高版本中对其进行了测试,并且工作正常。
有关更好的解释,请参见this codelab by Android
答案 4 :(得分:0)
请记住,Dark Mode
不是 Night Mode
。他们是完全不同的。 DM 是在 Android 10 中引入的,它强制使用内置的黑白颜色,而 NM 在早期版本中使用默认/定义的样式,具体取决于您的实现。如果您希望您的应用使用您定义的亮/夜样式而不依赖于内置的暗样式,您可能需要在 themes.xml 或 style.xml 中将 forceDarkAllowed
设为 false,因为 DM 可能会发生冲突。
要将您的应用模式更改为夜间,请使用 AppCompatDelegate。
// This will be the top level handling of theme
AppCompatDelegate.setDefaultNightMode(
if (userPrefModeIsNight)
AppCompatDelegate.MODE_NIGHT_YES
else
AppCompatDelegate.MODE_NIGHT_NO)