Frage

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?

War es hilfreich?

Lösung

Von dem Onpreferencechangelistener Dokumente:

Kehrt zurück
Es ist wahr, den Status der Präferenz mit dem neuen Wert zu aktualisieren.

Daran kann dies erfasst werden, dass sich der Wert der Präferenz nicht ändert, wenn der Hörer zurückkehrt Stimmt. Mit anderen Worten, die newValue Parameter von onPreferenceChange() ist, was der Wert sein wird, aber noch nicht das, was er derzeit ist (denn Ihr Protokollprüfung befindet sich im Hörer, bevor True zurückgegeben wurde).

Nebenbei bemerkt, ich denke, der Zweck ist, dass Sie eine ungültige Änderung einer Präferenz ablehnen können. Wenn beispielsweise die Präferenz eine Zeichenfolge war und es gewünscht wird, dass sie Strings nur von einem bestimmten Anteil akzeptierter Werte akzeptiert, kann der Entwickler die Änderung ablehnen, indem sie false in in die zurückgibt in onPreferenceChange().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top