PreferenceFragment 不保存值 - 带有测试用例和屏幕截图

PreferenceFragment not saving values - with test case and screenshot

我已经为我的问题准备了 a simple test case at GitHub 并且感觉只缺少几行代码就无法正常工作。

在一个 Android 应用程序中,我有 1 个 activity (MainActivity.java) and 2 fragments (MainFragment.java and PrefFragment.java) - 当我更改首选项片段中的值时,它们不会被保存。

此外,默认值未加载且摘要未更新:

这是我的 PrefFragment,我在其中注册了一个共享首选项侦听器 - 为了更新摘要 - 但由于某些原因它从未被调用:

public class PrefFragment extends PreferenceFragment 
    implements OnSharedPreferenceChangeListener {

    public static final String BOOL_1 = "bool_1";
    public static final String STR_1 = "str_1";
    public static final String STR_2 = "str_2";

    private CheckBoxPreference mBool1;
    private EditTextPreference mStr1;
    private EditTextPreference mStr2;
    private SharedPreferences mPrefs;   
    private Editor mEditor;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(false);
        addPreferencesFromResource(R.xml.preferences);
        mBool1 = (CheckBoxPreference) findPreference(BOOL_1);
        mStr1 = (EditTextPreference) findPreference(STR_1);
        mStr2 = (EditTextPreference) findPreference(STR_2);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mPrefs = PreferenceManager.getDefaultSharedPreferences(activity);
        mEditor = mPrefs.edit();
        mPrefs.registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mPrefs.unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences prefs, 
                                          String key) {
        Log.d("onSharedPreferenceChanged", key); // XXX is never called

        if (BOOL_1.equals(key)) {
            boolean bool1 = prefs.getBoolean(key, false);
            mBool1.setSummary(bool1 ? "Enabled" : "Disabled");
        } else if (STR_1.equals(key)) {
            String str1 = prefs.getString(key, "");
            mStr1.setSummary(str1);
        } else if (STR_2.equals(key)) {
            String str2 = prefs.getString(key, "");
            mStr2.setSummary(str2);
        }       
    }    
}

这里是 preference.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <PreferenceCategory 
        android:title="Category 1"
        android:key="category_1">

        <CheckBoxPreference
            android:key="bool_1"
            android:title="Boolean 1"
            android:summary="XXX how to set this? XXX"
            android:defaultValue="false" />
        <EditTextPreference 
            android:dependency="bool_1"
            android:key="str_1"
            android:title="String 1"
            android:summary="XXX how to set this? XXX"
            android:defaultValue="change me" />
        <EditTextPreference 
            android:dependency="bool_1"
            android:key="str_2"
            android:title="String 2"
            android:summary="XXX how to set this? XXX"
            android:defaultValue="change me too" />
        </PreferenceCategory>

</PreferenceScreen>

所以我的问题是如何处理(加载、保存)PreferenceFragment? Do I really have to extend EditTextPreference 中的值并在我的自定义 class 中实现 onDialogClosed 方法?这对我来说似乎是一种矫枉过正的方法。

其中,以下似乎适用于 PrefFragment.java

@Override
public void onResume() {
    super.onResume();

    SharedPreferences prefs = getPreferenceManager().getSharedPreferences();

    // CHANGE 1: load saved values to set the summaries
    onSharedPreferenceChanged(prefs, BOOL_1);
    onSharedPreferenceChanged(prefs, STR_1);
    onSharedPreferenceChanged(prefs, STR_2);

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

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