setDefaultNightMode() 仅在 PreferenceFragment 中第二次调用后有效
setDefaultNightMode() only works after second call in PreferenceFragment
我正在努力在我的应用中实现深色模式。现在,我尝试使用嵌套在 AppCompatActivity
中的 PreferenceFragment
在明暗模式之间切换 UI 模式。 App 的行为是这样的,从浅色主题开始为默认值:
- 如果我select'dark'在ListPreference中,
偏好发生变化,但 UI 在此活动和所有其他活动中保持清淡。
- 如果我 select 'dark' 第二次,activity 切换到深色主题,以及后台堆栈中的其他活动。
- 同样的事情反过来发生,当我想切换回浅色主题时。
所以基本上一切正常,但您必须 select ListPreference 中的所需值两次。 ListPreference 的代码:
final Preference listPreferenceDesign = findPreference(PREF_DESIGN);
listPreferenceDesign.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
if (((ListPreference) preference).getValue().equals("light")) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
} else if (((ListPreference) preference).getValue().equals("dark")) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
return true;
}
});
到目前为止我尝试了什么:
- 在
return true;
语句 之前调用getActivity.recreate()
- 使用
Handler
短暂延迟后调用 getActivity.recreate()
- 当布尔值
changedDesignSetting
为真时,在父 Activity 的 onResume()
方法中调用 this.recreate()
感谢您的进一步帮助。
我终于使用父 activity 中的 OnSharedPreferenceChangeListener
让它工作了。现在父 activity 中的代码如下所示:
getFragmentManager().beginTransaction().replace(R.id.settingsPlaceholderID, preferenceFragment).commit();
SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(PREF_DESIGN)) {
if (sharedPreferences.getString(key, "light").equals("light")) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
}
}
};
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
而在 PreferenceFragment 中我只有:
final Preference listPreferenceDesign = findPreference(PREF_DESIGN);
listPreferenceDesign.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
return true;
}
});
我正在努力在我的应用中实现深色模式。现在,我尝试使用嵌套在 AppCompatActivity
中的 PreferenceFragment
在明暗模式之间切换 UI 模式。 App 的行为是这样的,从浅色主题开始为默认值:
- 如果我select'dark'在ListPreference中, 偏好发生变化,但 UI 在此活动和所有其他活动中保持清淡。
- 如果我 select 'dark' 第二次,activity 切换到深色主题,以及后台堆栈中的其他活动。
- 同样的事情反过来发生,当我想切换回浅色主题时。
所以基本上一切正常,但您必须 select ListPreference 中的所需值两次。 ListPreference 的代码:
final Preference listPreferenceDesign = findPreference(PREF_DESIGN);
listPreferenceDesign.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
if (((ListPreference) preference).getValue().equals("light")) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
} else if (((ListPreference) preference).getValue().equals("dark")) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
return true;
}
});
到目前为止我尝试了什么:
- 在
return true;
语句 之前调用 - 使用
Handler
短暂延迟后调用 - 当布尔值
changedDesignSetting
为真时,在父 Activity 的onResume()
方法中调用this.recreate()
getActivity.recreate()
getActivity.recreate()
感谢您的进一步帮助。
我终于使用父 activity 中的 OnSharedPreferenceChangeListener
让它工作了。现在父 activity 中的代码如下所示:
getFragmentManager().beginTransaction().replace(R.id.settingsPlaceholderID, preferenceFragment).commit();
SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(PREF_DESIGN)) {
if (sharedPreferences.getString(key, "light").equals("light")) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
}
}
};
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
而在 PreferenceFragment 中我只有:
final Preference listPreferenceDesign = findPreference(PREF_DESIGN);
listPreferenceDesign.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
return true;
}
});