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;
}
});
我正在尝试从扩展 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;
}
});