我正在使用Theme.AppCompat.DayNight
Android Support Library 23.2
在Android 5.1上运行良好。
在Android 6.0上,活动看起来像使用灯光主题,但对话框看起来使用黑暗主题。
我的申请类:
public class MyApplication extends Application {
static {
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_YES);
}
}
我的styles.xml
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="Dialog.Alert" parent="Theme.AppCompat.DayNight.Dialog.Alert"/>
我的代码显示对话框:
new AlertDialog.Builder(mContext, R.style.Dialog_Alert)
.setTitle("Title")
.setMessage("Message")
.show();
答案 0 :(得分:5)
Google已将其修复为支持23.2.1
旧回答:
在Android 6.0上,系统的夜间模式设置defalut为print "fdfdf"
for x in [1, 2, 3]: print("dsds")
print "d"
,在调用UiModeManager.MODE_NIGHT_NO
之前会更改Resources.Configuration.uiMode
。但是,支持库会在onCreate
的{{1}}中应用其夜间模式设置,为时已晚,我认为这就是为什么它无法在6.0上运行。
因此,如果我们可以覆盖onCreate
中的AppCompatActivity
并更改getResources()
。
旧回答:
以下是修复无法在Android 6.0上运行的代码
AppCompatActivity
注意:如果您的应用没有位置权限,您的应用将无法获得相同的系统计算结果。这意味着当系统没有时,可能支持库认为它是夜晚,这会导致你的一些UI看起来很暗。
最好的方法是等待Google修复它。
答案 1 :(得分:2)
在Application.Current.Windows[Application.Current.Windows.Count - 1].Close();
之后添加getDelegate().applyDayNight();
。
答案 2 :(得分:2)
此问题已在https://code.google.com/p/android/issues/detail?id=201910
上报告但在发布Android支持库后,修订版23.2.1(2016年3月)。 此问题已得到解决。
修复了夜间模式和API级别23的兼容性问题
将支持库更新为Android Support Library to 23.2.1
答案 3 :(得分:1)
只需在你的值-v21
中添加它<style name="Theme.AppCompat.DayNight">
为我工作 完成。
答案 4 :(得分:1)
到目前为止,除了已经存在的androidx.appcompat:appcompat:1.0.2
之外,不需要Gradle依赖项即可启用夜间模式。确保将 styles.xml 文件中的默认主题从Theme.AppCompat.Light.DarkActionBar
更改为Theme.AppCompat.DayNight.DarkActionBar
,然后执行AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
切换到夜间模式。我已经在APIv23(Android 6.0)及更高版本中对其进行了测试,并且工作正常。
有关更好的解释,请参见this codelab by Android
答案 5 :(得分:0)
最好的解决方案是使用适当的配置更新上下文。这是我的工作摘要:
@Spy
然后像这样在您的应用程序中使用上下文
public Context setupTheme(Context context) {
Resources res = context.getResources();
int mode = res.getConfiguration().uiMode;
switch (getTheme(context)) {
case DARK:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
mode = Configuration.UI_MODE_NIGHT_YES;
break;
case LIGHT:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
mode = Configuration.UI_MODE_NIGHT_NO;
break;
default:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
break;
}
Configuration config = new Configuration(res.getConfiguration());
config.uiMode = mode;
if (Build.VERSION.SDK_INT >= 17) {
context = context.createConfigurationContext(config);
} else {
res.updateConfiguration(config, res.getDisplayMetrics());
}
return context;
}