Ich versuche, meine Bevorzugung mit Fragmenten aufzubauen. Ich habe eine Präferenzfragment mit zwei 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" />
Meine Fragmenteettsaktivität:
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));
}
}
}
Der erste Anruf von OnPreferencechange legt die Zusammenfassung ordnungsgemäß fest, aber jeder andere Anruf legt die entgegengesetzte Zusammenfassung fest: Wenn das Kontrollkästchen überprüft wird, wird die "deaktivierte" Zusammenfassung festgelegt und umgekehrt.
Es scheint, dass IsChecked () einen falschen Wert zurückgibt, da value.toString () den richtigen Zustand als Zeichenfolge zurückgibt.
log () Drucke:
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
Wo ist mein Fehler?