Commutateur de Préférence de Manutention à la fois onPreferenceChange et onPreferenceClick

J'ai essayé d'obtenir un commutateur de préférence de travail dans Android par lequel je peux intercepter et gérer différemment, dans certains cas, quand ils l'activer/la désactiver vs lorsqu'ils cliquent sur l'ensemble de la préférence.

C'est ce que je suis en train de réaliser:
L'utilisateur va dans les préférences de balises sont éteints et les tags ne sont pas stockées (ie: tag préférence est vide)
L'utilisateur s'allume préférence pour les balises, et depuis pas de balises sont stockés actuellement, il lance une balise de l'activité de recherche de l'utilisateur pour trouver la balise. - fonctionne très bien.

Si le tag existe déjà, et ils changent l'état que puis mettre à jour la valeur normale. - fonctionne très bien

Voici mon problème:
S'ils cliquent sur la préférence et si elles ont déjà une balise sauvé, ne modifie pas l'état (peu importe si c'est activé ou désactivé), le lancement de la balise de l'activité de recherche. - cela NE fonctionne PAS.

Ce que j'ai trouvé pour l'instant est que dans le dernier scénario ci-dessus, je reçois un appel de onPreferenceChanged, suivi par un appel à onPreferenceClicked, suivi par un appel ultérieur à onPreferenceChanged. Cela semble être mon problème. Le premier appel à onPreferenceChanged causes de mon écouteur sur mon SharedPreferences pour être appelé en lui disant que c'est maintenant activé.

Si je n'ai pas reçu le premier appel à onPreferenceChanged alors je n'aurais pas un problème.

Voici les parties pertinentes où je suis définition des écouteurs

SwitchPreference tagPref = (SwitchPreference) findPreference(PreferencesConstants.PREFERENCE_TAG_ENABLED);
    tagPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            Log.e("BLAH", "onPrefChanged....is it handled by OnClick?" + Boolean.toString(handledByClick));


            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());

            boolean enabled = prefs.getBoolean(PreferencesConstants.PREFERENCE_TAG_ENABLED, false);
            Log.e("BLAH", "value stored in prefs? " + Boolean.toString(enabled));
            if (newValue instanceof Boolean) {
                enabled = (Boolean) newValue;
            }

            Log.e("BLAH", "New value? " + Boolean.toString(enabled));

            if (!handledByClick) {
                if (enabled && (currentTag == null || currentTag.isEmpty())) {
                    Log.e("BLAH", "Enabled and CurrentTag empty!");
                    Intent intent = new Intent(getActivity(), TagSearchActivity.class);
                    startActivityForResult(intent, 0);

                    return false; //always return false, we'll handle
                                    //updating
                                    //this value manually.
                } else {
                    return true;
                }
            }
            Log.e("BLAH", "returning false (AS IN WE HANDLED IT).");
            return false;
        }
    });

    tagPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {

        @Override
        public boolean onPreferenceClick(Preference preference) {

            handledByClick = true;
            Log.e("BLAH", "onprefClick");

            Intent intent = new Intent(getActivity(), TagSearchActivity.class);
            startActivityForResult(intent, 0);

            return true;
        }
    });

Voici les lignes du journal après l'exécution avec un sauvés de la balise, et en cliquant sur la préférence.

01-18 15:55:05.593: E/BLAH(13261): onPrefChanged....is it handled by OnClick?false
01-18 15:55:05.593: E/BLAH(13261): value stored in prefs? true
01-18 15:55:05.593: E/BLAH(13261): New value? false
01-18 15:55:05.613: E/DifferentClass(13261): On Shared Preferences Changed - tagEnabled
01-18 15:55:05.652: E/DifferentClass(13261): disabled TAG in cancelAlarmService
01-18 15:55:05.662: E/AnotherClass(13261): Updating Feed List.  Old Size: 33, New Size: 14
01-18 15:55:05.682: E/BLAH(13261): onprefClick
01-18 15:55:05.812: E/BLAH(13261): onPrefChanged....is it handled by OnClick?true
01-18 15:55:05.812: E/BLAH(13261): value stored in prefs? false
01-18 15:55:05.822: E/BLAH(13261): New value? false
01-18 15:55:05.822: E/BLAH(13261): returning false (AS IN WE HANDLED IT).

OriginalL'auteur forevercrashed | 2013-01-18