【问题标题】:setDefaultNightMode() only works after second call in PreferenceFragmentsetDefaultNightMode() 仅在 PreferenceFragment 中的第二次调用后有效
【发布时间】:2019-08-23 13:01:42
【问题描述】:

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

  • 如果我在 ListPreference 中选择“dark”,则 偏好会发生变化,但 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;
    }
});

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

  • return true;声明之前调用getActivity.recreate()
  • 在短暂延迟后使用Handler 致电getActivity.recreate()
  • 当布尔值 changedDesignSetting 为真时,在父 Activity 的 onResume() 方法中调用 this.recreate()

感谢您的进一步帮助。

【问题讨论】:

    标签: android preferencefragment android-night-mode android-dark-theme


    【解决方案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;
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      相关资源
      最近更新 更多