Question

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?

Était-ce utile?

La solution

Du OnPreferencECheListener Docs:

Retour
True pour mettre à jour l'état de la préférence avec la nouvelle valeur.

Ce qui peut être recueilli à partir de cela, c'est que la valeur de la préférence ne change pas réellement avant le retour de l'auditeur vrai. En d'autres termes, le newValue paramètre onPreferenceChange() c'est ce que sera la valeur, mais pas encore ce qu'elle est actuellement (car votre vérification du journal est à l'intérieur de l'auditeur, avant que True n'ait été retourné).

Selon une note, je pense que le but de cela est pour que vous puissiez rejeter un changement invalide en préférence. Par exemple, si la préférence était une chaîne, et il est souhaité qu'il n'accepte que les chaînes à partir d'un certain tableau de valeurs acceptées, le développement peut rejeter le changement en renvoyant False dans onPreferenceChange().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top