使用 PreferenceDataStore 时 PreferenceScreen/PreferenceFragment 的初始值

Initial values for PreferenceScreen/PreferenceFragment when using PreferenceDataStore

我正在实现一个首选项屏幕,它是一个 XML 文件,其中 PreferenceScreen 标记在 PreferenceFragment 中膨胀。通常这是由 SharedPreferences 支持的,但是对于我的特殊情况,我们将 SharedPreferences 交换为自定义 PreferenceDataStore 以获取某些首选项。

在 Fragment onCreate 方法中,我们获取个人偏好并将它们挂接到 PreferenceDataStore。

SwitchPreference pref = (SwitchPreference) findPreference("my_boolean_preference");
pref.setPreferenceDataStore(dataStore);

除首次显示屏幕时忽略当前值外,这工作正常。当屏幕首次显示正确时,如何获取该值。我应该把上面的代码放在 onCreate 以外的地方吗?我应该调用一些刷新或重新绑定吗?

目前我正在通过在调用 setPreferenceDataStore 后手动设置值来解决这个问题。

pref.setChecked(dataStore.getBoolean("my_boolean_preference", false));

来自here

Note: If you set a data store for a Preference after the Preference is attached to the hierarchy, the initial value for the Preference is not propagated again.

你可以这样做:

class MyFragment : PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle, rootKey: String) {
        super.onCreatePreferences(savedInstanceState, rootKey)

        // set dataStore before calling setPreferencesFromResource()
        preferenceManager?.preferenceDataStore = dataStore

        setPreferencesFromResource(R.xml.prefs_main, rootKey)
        ...
    }
}