我在 GitHub 上为我的问题准备了一个简单的测试用例,并且有一种感觉,只缺少几行代码就可以让它工作。
在 Android 应用程序中,我有 1 个活动(MainActivity.java)和 2 个片段(MainFragment.java和PrefFragment.java) - 当我更改首选项片段中的值时,它们不会被保存。
此外,未加载默认值且未更新摘要:
这是我的PrefFragment,我在其中注册了一个共享的 prefs 侦听器 - 为了更新摘要 - 但由于某种原因,它从未被调用:
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);
}
}
}
<?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中的值?我真的必须在我的自定义类中扩展EditTextPreference并实现onDialogClosed
方法吗?这对我来说似乎是一种矫枉过正的方法。