Android:SharedPreferences 未从 PreferenceFragment 更新

Android: SharedPreferences not getting updated from PreferenceFragment

由于上次没有得到任何答案,我再次发布这个问题,我仍然没有解决问题。

我有一个带有 PreferenceScreen 的设置菜单,在其中我在运行时创建了很多 CheckBoxPreferences(将它们添加到 "Exclusion List" prefscreen)。我创建它们没问题,这是下面的 XML 代码,它以以下内容开头:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceScreen
        android:key="exclusion_list_key"
        android:title="Exclusion List"
        android:persistent="true"
        android:summary="" >
    </PreferenceScreen>
</PreferenceScreen>

我在 PreferenceFragment 的 onCreate 方法中创建复选框并将它们添加到 "Exclusion List" PreferenceScreen 并且工作正常。

我正在尝试将 "Exclusion List" 的摘要设置为所有选中的复选框标题的列表(因此,如果复选框被选中,它的名称将列在摘要中"Exclusion List").

在onCreate()方法中,summary设置正确,没有问题。

但在 onPreferenceChanged() 方法中,我将 "Exclusion List" 的摘要设置为我构建的 'summary' 字符串(包含正确的值),但它不会更新它!当我从复选框菜单中按回键时,"Exclusion List" 没有更新值。

最后几行是感兴趣的。我做了一些 printlns 以查看发生了什么:

  1. 侦听器工作正常,按预期运行

  2. 我的摘要变量包含预期内容

  3. 调用 setSummary(summary) 后,getSummary() returns 预期值(这意味着它已正确设置)

  4. 然而,当我实际按下回看 "Exclusion List" 时,它的摘要实际上并没有得到更新!

我错过了什么吗?提前致谢!

全部代码供参考:

public class Settings extends AppCompatActivity {

    public static final String EXC_LIST_KEY = "exclusion_list_key";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();
    }

    public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.preferences);
            String summary = "";

            //Create all the checkboxes inside of the PreferenceScreen
            for (int i = 0; i < MainActivity.contactNames.length; i++) {
                CheckBoxPreference checkbox = new CheckBoxPreference(getActivity());
                checkbox.setTitle(MainActivity.contactNames[i][0]);
                checkbox.setKey(MainActivity.contactNames[i][2]);
                checkbox.setSummary(MainActivity.contactNames[i][1]);
                checkbox.setDefaultValue(false);
                ((PreferenceScreen) findPreference(EXC_LIST_KEY)).addPreference(checkbox);
                if (checkbox.isChecked()) {
                    summary = summary + checkbox.getTitle() + "\n";
                }
            }
            findPreference(EXC_LIST_KEY).setSummary(summary);
            getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
        }

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            //Checkbox keys all start with 'key_'
            if (key.startsWith("key_")) {
                String summary = "";
                for (int i = 0; i < MainActivity.contactNames.length; i++) {
                    CheckBoxPreference checkbox = (CheckBoxPreference) findPreference(MainActivity.contactNames[i][2]);
                    if (checkbox.isChecked()) {
                        summary = summary + checkbox.getTitle() + "\n";
                    }
                }
                System.out.println("Summary I have: " + summary); //Correct summary is printed out
                findPreference(EXC_LIST_KEY).setSummary(summary); //Isn't updating the value???
                System.out.println("Summary system has: " + findPreference(EXC_LIST_KEY).getSummary()); //Correct summary is printed out
            }
        }
    }
}

尝试在您的 SettingsFragment

中添加此代码
 @Override
public void onResume() {
    super.onResume();

    SharedPreferences prefs = getPreferenceManager().getSharedPreferences();

    // CHANGE 1: load saved values to set the summaries
    onSharedPreferenceChanged(prefs, "exclusion_list_key");

    // CHANGE 2: register shared prefs listener in onResume
    prefs.registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    super.onPause();
    SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
    prefs.unregisterOnSharedPreferenceChangeListener(this);
}

通过将以下代码行添加到我的 onSharedPreferenceChanged() 方法的末尾使其工作:

((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();