Comment pouvez-vous définir l'écouteur d'événements pour un Spinner lorsque l'élément sélectionné change?
Fondamentalement, ce que j'essaie de faire est quelque chose de similaire à ceci:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
android
events
spinner
android-spinner
Soni Ali
la source
la source
Réponses:
Certaines des réponses précédentes ne sont pas correctes. Ils fonctionnent pour d'autres widgets et vues, mais la documentation du widget Spinner indique clairement:
Mieux vaut utiliser OnItemSelectedListener () à la place:
Cela fonctionne pour moi.
Notez que la méthode onItemSelected est également invoquée lors de la génération de la vue, vous pouvez donc envisager de la placer dans l'
onCreate()
appel de méthode.la source
onItemSelected(...)
n'est pas touché. (Je sais parce que je viens de découvrir cela à la dure.)Remarque: N'oubliez pas une chose.
L'
OnItemSelectedListener
événement Spinner s'exécutera deux fois:Essayez de différencier ces deux en utilisant la variable indicateur.
la source
Vous pouvez implémenter la
AdapterView.OnItemSelectedListener
classe dans votre activité.Et puis utilisez la ligne ci-dessous dans
onCreate()
Remplacez ensuite ces deux méthodes:
la source
https://stackoverflow.com/q/1714426/811625
Vous pouvez éviter l'appel de OnItemSelectedListener () avec une simple vérification: stockez l'index de sélection actuel dans une variable entière et vérifiez dans onItemSelected (..) avant de faire quoi que ce soit.
Par exemple:
La cause du
iCurrentSelection
devrait être portée d'objet pour que cela fonctionne!la source
iCurrentSelection
variable est déclarée dans cette classe anonyme, cela fonctionnera correctement. Vous pouvez l'initialiser à -1 pour que le code soit exécuté lors du premier appel.Trouvez votre nom de spinner et trouvez id puis implémentez cette méthode.
la source
Peu importe si vous définissez OnItemSelectedListener dans onCreate ou onStart - il sera toujours appelé lors de la création ou du démarrage de l'activité (respectivement).
Nous pouvons donc le définir dans onCreate (et PAS dans onStart!).
Ajoutez simplement un drapeau pour comprendre la première initialisation:
puis dans onCreate (ou onCreateView) juste:
la source
Les documents pour le widget spinner indiquent
Vous devez utiliser
setOnItemSelectedListener
pour gérer votre problème.la source
la source
prendre une variable globale pour la sélection actuelle de spinner:
la source
Si vous voulez un vrai onChangedListener (). Stockez la valeur initiale dans le gestionnaire et vérifiez si elle a changé. Il est simple et ne nécessite pas de variable globale. Fonctionne si vous avez plus d'un spinner sur la page.
...
Les objets sont votre ami, utilisez-les.
la source
la source
Cela fonctionnera pour initialiser le spinner et findviewbyid et l'utiliser cela fonctionnera
la source
La meilleure façon ce que je pense serait d'avoir un
flagitemselected = 0;
dansonCreate()
. Et sur l'élément sélectionné, incrémentez l'événement, c'est-à-direflagitemselected++
; puis vérifiezCela aidera, je suppose.
la source
Une astuce que j'ai trouvée consistait à placer vos setOnItemSelectedListeners dans onWindowFocusChanged au lieu de onCreate. Je n'ai pas encore trouvé de mauvais effets secondaires à le faire de cette façon. Fondamentalement, configurez les écouteurs une fois la fenêtre dessinée. Je ne sais pas combien de fois onWindowFocusChanged s'exécute, mais il est assez facile de créer vous-même une variable de verrouillage si vous la trouvez trop souvent.
Je pense qu'Android peut utiliser un système de traitement basé sur les messages, et si vous mettez tout cela dans onCreate, vous pouvez rencontrer des situations où le spinner est rempli après avoir été dessiné. Ainsi, votre auditeur se déclenchera après avoir défini l'emplacement de l'élément. C'est une supposition éclairée, bien sûr, mais n'hésitez pas à me corriger à ce sujet.
la source
Par défaut, vous obtiendrez le premier élément du tableau de spinner via
chaque fois que vous avez sélectionné la valeur dans le spinner, cela vous donnera la valeur sélectionnée
si vous voulez la position de l'élément sélectionné, faites-le comme ça
les deux réponses ci-dessus sont pour sans appliquer l'auditeur
la source