我正在尝试使用片段构建我的PreferenceActivity。我有一个包含两个PreferenceFragment的CheckBoxPreferences:
<CheckBoxPreference
android:key="pref_bfp_scale"
android:title="@string/PREF_BFP_scale_title"
android:defaultValue="false" />
<CheckBoxPreference
android:key="pref_bfp_navy"
android:title="@string/PREF_BFP_navy_title"
android:defaultValue="true" />我的FragmentSettingsActivity:
public class FragmentSettingsActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public static class BodyFatPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_body_fat);
bindPrefSumtoValListener(findPreference("pref_bfp_scale"), "Boolean");
bindPrefSumtoValListener(findPreference("pref_bfp_navy"), "Boolean");
}
}
private static Preference.OnPreferenceChangeListener prefSumtoValListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
String stringValue = value.toString();
log("Pref changed - Value: " + stringValue);
if (preference instanceof CheckBoxPreference) {
Map<String, Integer> checkboxes = new HashMap<String, Integer>();
checkboxes.put("pref_bfp_navy_unchecked", R.string.PREF_BFP_navy_summary_unchecked);
checkboxes.put("pref_bfp_navy_checked", R.string.PREF_BFP_navy_summary_checked);
checkboxes.put("pref_bfp_scale_unchecked", R.string.PREF_BFP_scale_summary_unchecked);
checkboxes.put("pref_bfp_scale_checked", R.string.PREF_BFP_scale_summary_checked);
log(Boolean.toString(((CheckBoxPreference) preference).isChecked()));
log(String.format("? : %s_%s", preference.getKey(), ((CheckBoxPreference) preference).isChecked()? "checked" : "unchecked"));
preference.setSummary(checkboxes.get(String.format("%s_%s", preference.getKey(), ((CheckBoxPreference) preference).isChecked()? "checked" : "unchecked")));
}
return true;
}
};
private static void bindPrefSumtoValListener(Preference preference, String type) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(preference.getContext());
preference.setOnPreferenceChangeListener(prefSumtoValListener);
if (type.equals("Boolean")) {
prefSumtoValListener.onPreferenceChange(preference, sharedPreferences.getBoolean(preference.getKey(), false));
}
}
}onPreferenceChange的第一次调用正确地设置了摘要,但其他每个调用都设置了相反的摘要:如果选中了Box,则设置“未检查”摘要,反之亦然。
似乎isChecked()返回某种错误的值,因为value.toString()以字符串的形式返回正确的状态。
log()打印:
log("Pref changed - Value: " + stringValue);
//Output: Pref changed - Value: true
log(Boolean.toString(((CheckBoxPreference) preference).isChecked()));
//Output: false
log(String.format("? : %s_%s", preference.getKey(), ((CheckBoxPreference) preference).isChecked()? "checked" : "unchecked"));
//Output: ? : pref_bfp_navy_unchecked我的错误在哪里?
发布于 2013-11-07 22:57:07
来自OnPreferenceChangeListener文档:
返回 若要用新值更新首选项的状态,则为True。
从中可以收集到的是,在侦听器返回真之前,首选项的值实际上不会改变。换句话说,newValue参数的onPreferenceChange()将是什么值,但不是它目前是什么(因为您的日志检查在侦听器中,在返回true之前)。
另外,我认为这样做的目的是使您能够拒绝对首选项的无效更改。例如,如果首选项是字符串,并且希望它只接受来自某个可接受值数组的字符串,则开发人员可以通过在onPreferenceChange()中返回false来拒绝更改。
https://stackoverflow.com/questions/19848061
复制相似问题