AppCompat DayNight主题在Android 6.0上不起作用?

时间:2016-02-27 03:06:13

标签: android xml android-layout android-support-library android-theme

我正在使用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();

6 个答案:

答案 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;
}