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
Vous devez vous connecter pour publier un commentaire.
Je travaille avec le même problème depuis des siècles maintenant, et vous pouvez aller à ce sujet de deux façons.
Mise en œuvre d'un switchpreference avec des actions personnalisées pour chaque événement:
forevercrashed fait quelques bons points. J'ai essayé de les suivre, mais pour moi ils n'ont pas. Je parie qu'ils travaillent, mais j'ai besoin de plus de fonctionnalités dans un moyen plus facile. Xgouchet (deuxième Lien) utilise des en-Têtes et xml personnalisées mises en page qui utilise personnalisé des stages et des mesures (hauteur, witdth, rembourrage, etc.). J'ai besoin d'une solution sans modifier Googles construit en auto-généré de mise en page.
La super facile et puissant: mettre en place votre propre
SwitchPreference
!Il suffit de faire une classe étendre
SwitchPreference
puis de mettre en place/remplacement de la sorte:En substituant
onClick()
et en commentant /suppression desuper.onClick()
rend le SwitchPreference PAS appelcallChangeListener(Object newValue)
. Maintenant, vous pouvez cliquez sur la préférence et rien ne se passe, pas jusqu'à ce que vous souhaitez.(Un bug qui pourraient se produire autrement, c'était d'avoir de multiples appels à
onPreferenceChange
dans le fragment)Maintenant! Pour faire bouger les choses: Ici, c'est la structure que j'ai utilisé.
SettingsActivity
onCreate()
dans votre Activité - de lancer unePreferenceFragment
PreferenceFragment
, voir comment ici : PreferenceFragmentDans votre personnalisé Fragment, obtenir votre propre préférence. Vous pouvez utiliser
findPreference("custom_switch_key")
.OnPreferenceChangeListener
sur la préférencethis
comme argument.return false;
vous pouvez modifier la valeur avec setChecked(true|false) sur la switchpreference.lorsque vous implémentez
onPreferenceChange(Preference preference, Object newValue)
vous pouvez ajouter toutes les fonctionnalités que vous souhaitez en appuyant sur l'interrupteur-slider seulementonClick()
plus loin dans la coutumeSwitchPreference
classeonPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
dans le fragmentonPreferenceClickListener
comme vous l'avez fait pour le ChangeListener.Désolé si c'est un long post. C'est mon premier et j'ai vu beaucoup de stackoverflow-pages à ce sujet et personne n'a été précis, je voulais juste l'obtenir droite 😉
je vous remercie. Cela fonctionne très bien sur mon Moto X (API 4.4.4), mais malheureusement, ne fonctionne pas sur Nexus 4 de l'API (5.0). Selon le code source Android (le
Listener
classe dansSwitchPreference
), il devrait fonctionner, mais le N4 encore n'enregistre que le onPreferenceClick lorsque le commutateur est enfoncé. Des idées?Je n'ai pas vraiment de réponses pour vous, là, désolé. Espérons que vous trouverez ce que vous cherchez
OriginalL'auteur Yokich
Après avoir cherché pendant des heures en plus, je suis tombé sur un couple de postes qui seront utiles à d'autres dans cette situation.
C'était la solution que j'ai opté pour mon problème: Comment puis-je créer une Préférence avec un EditTextPreference et un Togglebutton?
C'est une réponse très détaillée et est très utile dans la compréhension des préférences.
L'autre post je suis tombé sur celui-ci: http://xgouchet.fr/android/index.php?article4/master-on-off-preferences-with-ice-cream-sandwich
Il vous donnera à peu près le même aspect que celui ci-dessus, mais exige plus de travail et à cause de mes exigences ne fonctionne pas pour moi.
Aussi, je viens de réaliser que, pour obtenir le "vrai" look and feel de l'interrupteur de la préférence que vous aurez besoin de combiner un peu des 2 liens que j'ai posté ci-dessus. Alors que le premier lien que j'ai mis en place, j'ai réalisé après que le fait que le fichier de mise en page ne disposait que d'un titre, et pas de résumé. J'ai besoin à la fois le titre et le résumé. Le deuxième lien que j'ai posté a une très belle mise en page du fichier, qui est exactement ce que fait. J'ai toujours eu à changer un couple paddings et la taille du texte pour l'obtenir à regarder la même chose que les autres préférences dans les paramètres de mon écran...juste au cas où quelqu'un a besoin de cette info.
OriginalL'auteur forevercrashed
je pense que vous avez une question sur une fonctionnalité qui n'existe pas.
cependant , depuis la préférence de l'activité utilise une liste , vous pouvez utiliser quelques astuces afin de le personnaliser et de le gérer comme vous le souhaitez .
voici un post j'ai fait à propos de la personnalisation sur la base de l' ce site internet . ce que j'ai demandé il y est de savoir comment ajouter un listView , mais je ne savais pas qu'une activité de préférence utilise en fait un listview .
OriginalL'auteur android developer