AppCompat DayNight主题在Android 6.0上不起作用?
我正在使用Android支持库23.2中新增的AppCompat DayNight主题在Android 6.0上不起作用?,android,xml,android-layout,android-support-library,android-theme,Android,Xml,Android Layout,Android Support Library,Android Theme,我正在使用Android支持库23.2中新增的主题.AppCompat.DayNight 在安卓5.1上,它运行良好 在安卓6.0上,活动看起来像是使用浅色主题,而对话框看起来像是使用深色主题 我的申请类别: public class MyApplication extends Application { static { AppCompatDelegate.setDefaultNightMode( AppCompatDelegate.MO
主题.AppCompat.DayNight
在安卓5.1上,它运行良好
在安卓6.0上,活动看起来像是使用浅色主题,而对话框看起来像是使用深色主题
我的申请类别:
public class MyApplication extends Application {
static {
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_YES);
}
}
My 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"/>
添加
getDelegate().applyDayNight()
在设置DefaultNightMode
之后谷歌在支持23.2.1中对其进行了修复
旧答案:
在Android 6.0上,系统的夜间模式设置defalut是UiModeManager.mode\u night\u NO
,它将在调用onCreate
之前更改资源.Configuration.uiMode
。但是,在AppCompatActivity
中的onCreate
中,支持库应用其夜间模式设置,为时已晚,我认为这就是为什么它不能在6.0上工作的原因
因此,如果我们可以覆盖AppCompatActivity
中的getResources()
,并更改uiMode
旧答案:
以下是修复Android 6.0上不可用的代码
public class Application extends android.app.Application {
static {
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_);
}
@Override
public void onCreate() {
super.onCreate();
// add this code for 6.0
// DO NOT DO THIS. It will trigger a system wide night mode.
// This is the old answer. Just update appcompat.
// UiModeManager uiManager = (UiModeManager) getSystemService(Context.UI_MODE_SERVICE);
// uiManager.setNightMode(UiModeManager.MODE_NIGHT_);
}
}
注意:如果你的应用没有位置权限,你的应用将不会有相同的系统计算结果。这意味着支持库可能认为现在是晚上,而系统不在,这将导致您的一些UI看起来很暗
最好的方法是等待谷歌修复它。只需将其添加到您的values-v21中即可
<style name="Theme.AppCompat.DayNight">
为我工作
完成。此问题在 但在Android支持库发布后,修订版(2016年3月)此问题已解决。 修复了夜间模式和API级别23的兼容性问题
将支持库更新为Android支持库至23.2.1最好的解决方案是使用适当的配置更新上下文。以下是我所做工作的一个片段:
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;
}
然后像这样在应用程序中使用上下文
@Override
protected void attachBaseContext(Context base) {
Context context = ThemePicker.getInstance().setupTheme(base);
super.attachBaseContext(context);
}
到目前为止,启用夜间模式不需要Gradle依赖项,除了已经存在的
androidx.appcompat:appcompat:1.0.2
。确保将styles.xml文件中的默认主题从theme.AppCompat.Light.DarkActionBar
更改为theme.AppCompat.DayNight.DarkActionBar
,然后执行AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE\u NIGHT\u YES)
切换到夜间模式。我已经在APIv23(Android 6.0)和更高版本中对其进行了测试,效果良好。
有关更好的解释,请参见。它确实起了作用。我想关键是确保在AppCompatDelegate之前调用UiModeManager#setNightMode#applyDayNight。不要这样做。没有必要强制整个系统使用夜间模式,以便您可以在应用程序中使用它。等待23.2.1错误修复版本的发布。(来源:我是支持库的首席工程师)如果做出决定,请告诉我们发布的错误修复将在何时发布?谢谢!!我读到我应该使用
recreate()代码>但不管怎样,这都会冻结我的应用程序。
@Override
protected void attachBaseContext(Context base) {
Context context = ThemePicker.getInstance().setupTheme(base);
super.attachBaseContext(context);
}