AppCompatDelegate.setDefaultNightMode 仅适用于当前 Activity 而不是整个应用

AppCompatDelegate.setDefaultNightMode is applied only to the current Activity and not to the whole app

我正在尝试从扩展 PreferenceFragmentCompat 的片段更改主题(白天或晚上)。设置主题后,我调用 activity.recreate() 来应用主题,但它只会更改当前屏幕的主题(当我按回时,旧的主题是可见的)。如果我调用 activity.finish(),它会更改整个应用程序的主题。但我不想退出当前屏幕。知道如何解决这个问题吗?提前致谢。

preferenceTheme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                PreferencesUtils.setThemeDayOrNight(newValue.toString());
                Activity activity = getActivity();
                if(activity != null){
                    activity.recreate();
                }
                return true;
            }
        });

public static void setThemeDayOrNight(String themeValue) {
    if (themeValue.equalsIgnoreCase(THEME_DAY)) {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    } else {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    }
}

我找到了一个快速的解决方案,但不确定它是否是最好的。

使用 startForActivityResult from previous Activity 和 onActivityResult return 开始首选项 Activity 回到首选项 Activity像这样:

Intent intent = new Intent(this, MyPreferencesActivity.class);
            startActivityForResult(intent, RC_SETTINGS);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if(resultCode == RESULT_OK && requestCode == RC_PREFERENCES) {
        // To be able to change theme from settings and stay in the same screen after it we need
        // to get if theme was changed and then return to settings screen

        if (resultCode == RESULT_OK && data.getBooleanExtra(SettingsActivity.EXTRA_CHANGE_THEME, false)) {
            Intent intent = new Intent(this, MyPreferencesActivity.class);
            startActivityForResult(intent, RC_SETTINGS);
        }
    }
}

在 MyPreferencesActivity.class 上:

preferenceTheme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
            PreferencesUtils.setThemeDayOrNight(newValue.toString());

                if(activity != null) {
                    Intent resultIntent = new Intent();
                    resultIntent.putExtra(EXTRA_CHANGE_THEME, true);
                    setResult(Activity.RESULT_OK, resultIntent);
                    activity.finish();
                }

                return true;
            }
        });