J'essaie de construire ma préférence de préférence en utilisant des fragments. J'ai une préférence Fragment contenant deux coches PREFERENCES:
<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" />
Mon fragments de manière activité:
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));
}
}
}
Le premier appel de OnPreferenCheChange définit correctement le résumé, mais tous les autres appels définissent le résumé contraire: Si la case est cochée, le résumé "non contrôlé" est défini et vice versa.
Il semble qu'IsChecked () renvoie une sorte de mauvaise valeur car Value.ToString () renvoie l'état correct en tant que chaîne.
Log () Impressions:
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
Où est mon erreur?