Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AppCompat DayNight主题在Android 6.0上不起作用?_Android_Xml_Android Layout_Android Support Library_Android Theme - Fatal编程技术网

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

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

我正在使用Android支持库23.2中新增的
主题.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);
}