0

我正在努力在我的应用程序中实现暗模式。现在我尝试使用PreferenceFragment嵌套在AppCompatActivity. 该应用程序的行为是这样的,从作为默认值的浅色主题开始:

  • 如果我在 ListPreference 中选择“深色”,则首选项的摘要会更改,但 UI 在此活动和所有其他活动中保持浅色。
  • 如果我第二次选择“深色”,活动将切换到深色主题,以及后台堆栈中的其他活动。
  • 当我想切换回浅色主题时,反过来也会发生同样的事情。

所以基本上一切正常,但您必须在 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;
    }
});

到目前为止我尝试了什么:

  • 声明getActivity.recreate()前调用return true;
  • 在短暂getActivity.recreate()延迟后使用Handler
  • 当布尔值为 true时调用父 Activitythis.recreate()的方法onResume()changedDesignSetting

我感谢进一步的帮助。

4

1 回答 1

1

我终于让它OnSharedPreferenceChangeListener在父活动中使用。现在父活动中的代码如下所示:

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;
    }
});
于 2019-08-24T09:23:26.697 回答