如何在PreferenceFragmentCompat中使用SummaryProvider更新首选项?

时间:2019-06-12 20:22:50

标签: android sharedpreferences android-preferences

androidx.preference.Preference(使用1.1.0-beta01版)中,可以设置摘要提供程序,这是我在onCreatePreferences的{​​{1}}方法内完成的。

PreferenceFragmentCompat

当我现在(仍使用片段编辑器)在该片段仍可见的情况下更新该偏好时,如何通知该偏好或片段该摘要提供者应再次调用(不会自动完成)?不幸的是,我看不到任何方法或方法。

3 个答案:

答案 0 :(得分:0)

SummaryProvider主要用于在更新首选项摘要之后用于更新首选项摘要,例如,当选择ListPreference中的选项时,会强制更新{{1} },并因此触发Preference

如果通常是在首选项下更改数据,这里是否需要SummaryProvider?如果没有,您可以在更改数据时手动调用SummaryProvider,因为setSummary当前没有观察到其备份数据源。没有更多的示例代码很难说,但奇怪的是,当用户当前正在查看首选项时,如果没有用户的输入,数据就可以更改。

答案 1 :(得分:0)

    public class SettingsClass extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            addPreferencesFromResource(R.xml.settings_prefs);

            final SwitchPreferenceCompat switchPreferenceCompat = (SwitchPreferenceCompat) getPreferenceManager().findPreference("rememberME");
            switchPreferenceCompat.setSummaryProvider(new Preference.SummaryProvider() {
                @Override
                public CharSequence provideSummary(Preference preference) {
                    if (switchPreferenceCompat.isChecked()) {
                        return "Active";
                    }
                    return "Inactive";


                }
            });
    }}

//.xml file
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:key="test">
    <PreferenceCategory android:title="Σύνδεση">
    <SwitchPreferenceCompat
        app:key="rememberME"
        android:defaultValue="false"
        app:title="Παραμείνετε Συνδεδεμένος" />
    </PreferenceCategory>
</PreferenceScreen>

答案 2 :(得分:0)

我在理解此问题时遇到了一些麻烦,但是我只会使用setSummaryProvider来更新摘要,并使用ChangeListener来更新其他内容:

        with(findPreference<ListPreference>(PREFKEY_DOWNLOAD_SERVER)!!) {
            setSummaryProvider { pref ->
                getString(R.string.pref_download_server_summary, (pref as ListPreference).value)
            }
            setOnPreferenceChangeListener { _, newValue -> DataLoader.setSelectedServer(newValue as String); true }
        }