Je veux utiliser un Spinner qui initialement (lorsque l'utilisateur n'a pas encore fait de sélection) affiche le texte "Select One". Lorsque l'utilisateur clique sur la double flèche, la liste des éléments s'affiche et l'utilisateur sélectionne l'une des options. Une fois que l'utilisateur a effectué une sélection, l'élément sélectionné est affiché dans le Spinner au lieu de "Sélectionner un".
J'ai le code suivant pour créer un Spinner:
String[] items = new String[] {"One", "Two", "Three"};
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
Avec ce code, l'élément "One" est initialement affiché. Je pourrais simplement ajouter un nouvel élément "Select One" aux éléments, mais ensuite "Select One" serait également affiché dans la liste déroulante comme premier élément, ce qui n'est pas ce que je veux.
Comment puis-je résoudre ce problème?
android
android-spinner
Pieter Kuijpers
la source
la source
Réponses:
Voici une solution générale qui remplace la
Spinner
vue. Il remplacesetAdapter()
pour définir la position initiale à -1, et remplace le fourniSpinnerAdapter
pour afficher la chaîne d'invite pour une position inférieure à 0.Cela a été testé sur Android 1.5 à 4.2, mais attention à l'acheteur! Parce que cette solution repose sur la réflexion pour appeler le privé
AdapterView.setNextSelectedPositionInt()
etAdapterView.setSelectedPositionInt()
, il n'est pas garanti de fonctionner dans les futures mises à jour du système d'exploitation. Il semble probable que ce sera le cas, mais ce n'est en aucun cas garanti.Normalement, je ne tolérerais pas quelque chose comme ça, mais cette question a été posée suffisamment de fois et cela semble être une demande suffisamment raisonnable pour que je pense publier ma solution.
la source
Ce que vous pouvez faire, c'est décorer votre
SpinnerAdapter
avec celui qui présente une «option de sélection ...» initialement pour le Spinner à afficher sans rien sélectionné.Voici un exemple de travail testé pour Android 2.3 et 4.0 (il n'utilise rien dans la bibliothèque de compatibilité, donc ça devrait aller pendant un certain temps) Comme c'est un décorateur, il devrait être facile de moderniser le code existant et ça marche bien avec
CursorLoader
s aussi. (Échangez le curseur sur l'enveloppécursorAdapter
bien sûr ...)Il existe un bogue Android qui rend la réutilisation des vues un peu plus difficile. (Vous devez donc utiliser le
setTag
ou quelque chose d'autre pour vous assurer que votreconvertView
est correct.) Spinner ne prend pas en charge plusieurs types de vueNotes de code: 2 constructeurs
Cela vous permet d'utiliser une invite standard ou de définir votre propre «rien sélectionné» comme première ligne, ou les deux, ou aucune. (Remarque: certains thèmes affichent un DropDown pour un Spinner au lieu d'une boîte de dialogue. Le Dropdown n'affiche normalement pas l'invite)
Vous définissez une mise en page pour qu'elle ressemble à une invite, par exemple grisée ...
À l'aide d'une invite standard (notez que rien n'est sélectionné):
Ou avec une invite et quelque chose de dynamique (aurait pu aussi avoir aucune invite):
Utilisation dans l'exemple ci-dessus
contact_spinner_row_nothing_selected.xml
NothingSelectedSpinnerAdapter.java
la source
J'ai fini par utiliser un à la
Button
place. Bien que aButton
ne soit pas aSpinner
, le comportement est facile à personnaliser.Créez d'abord l'adaptateur comme d'habitude:
Notez que j'utilise le
simple_spinner_dropdown_item
comme id de mise en page. Cela aidera à créer une meilleure apparence lors de la création de la boîte de dialogue d'alerte.Dans le gestionnaire onClick de mon bouton, j'ai:
Et c'est tout!
la source
Tout d'abord, vous pourriez être intéressé par l'
prompt
attribut de laSpinner
classe. Voir l'image ci-dessous, "Choisir une planète" est l'invite qui peut être définie dans le XML avecandroid:prompt=""
.J'allais suggérer un sous
Spinner
- classement , où vous pourriez conserver deux adaptateurs en interne. Un adaptateur doté de l'option "Sélectionner un" et l'autre adaptateur réel (avec les options réelles), puis en utilisant leOnClickListener
pour changer les adaptateurs avant que la boîte de dialogue de choix ne s'affiche. Cependant, après avoir essayé de mettre en œuvre cette idée, je suis arrivé à la conclusion que vous ne pouvez pas recevoir d'OnClick
événements pour le widget lui-même.Vous pouvez envelopper le spinner dans une vue différente, intercepter les clics sur la vue, puis demander à votre
CustomSpinner
commutateur de changer d'adaptateur, mais cela semble être un horrible hack.Avez-vous vraiment besoin de montrer "Select One"?
la source
Ce code a été testé et fonctionne sur Android 4.4
la source
getItem(getCount())
est souligné en rouge pour moi? Impossible de résoudre la méthode setHintJ'ai trouvé cette solution:
Modifiez simplement le tableau [0] avec "Select One" puis dans onItemSelected, renommez-le en "One".
Pas une solution chic, mais ça marche: D
la source
Il n'y a pas d'API par défaut pour définir l'indice sur Spinner. Pour l'ajouter, nous avons besoin d'une petite solution de contournement sans mise en œuvre de la réflexion sur la sécurité
Source de l'adaptateur:
Source primaire
la source
android.R.id.text1
getCount
méthodeBeaucoup de réponses ici, mais je suis surpris que personne n'ait suggéré une solution simple: placez une TextView sur le Spinner. Définissez un écouteur de clic sur le TextView qui cache le TextView montre le Spinner et appelle spinner.performClick ().
la source
J'ai eu le même problème pour spinner, avec une sélection vide, et j'ai trouvé une meilleure solution. Jetez un oeil à ce code simple.
Ici, spinneradapter est une petite personnalisation pour arrayadapter. Cela ressemble à ceci:
la source
Vous pouvez le changer en vue texte et utiliser ceci:
puis définissez la
android:text
propriété.la source
Fichier XML:
Activité:
onCreate:
Certaines fonctions (ajouter des choses à l'adaptateur par programme)>
Vous avez maintenant un spinner vide et vous pouvez écrire du code pour ne pas ouvrir la boîte de dialogue s'il est vide. Ou ils peuvent appuyer. Mais vous le remplissez également avec une fonction ou une autre liste pendant l'exécution.
la source
J'ai essayé comme suit. Prenez un bouton et donnez-lui l'événement click. En changeant l'arrière-plan du bouton, il semble être un spinner.
Déclarez comme variables globales alertdialog et valeur par défaut.
la source
C'est mon chemin:
la source
Jetez un œil à l'application iosched pour une solution à usage général pour ajouter un élément en haut d'une liste. En particulier, si vous utilisez un CursorAdapter, regardez TracksAdapter.java qui étend cette définition pour fournir une méthode "setHasAllItem" et le code associé pour gérer le nombre de listes pour gérer l'élément supplémentaire en haut.
En utilisant l'adaptateur personnalisé, vous pouvez définir le texte sur "Sélectionner un" ou tout ce que vous voudrez que cet élément supérieur dise.
la source
J'ai un spinner sur mon main.xml et son identifiant est
@+id/spinner1
voici ce que j'écris dans ma fonction OnCreate:
Il n'a besoin d'aucune implémentation dans la classe.
la source
J'ai trouvé de nombreuses bonnes solutions pour cela. la plupart fonctionne en ajoutant un élément à la fin de l'adaptateur et n'affiche pas le dernier élément dans la liste déroulante. Le gros problème pour moi était que la liste déroulante spinner commencera par le bas de la liste. Ainsi, l'utilisateur voit les derniers éléments au lieu des premiers éléments (en cas de nombreux éléments à afficher), après avoir touché la roulette pour la première fois.
J'ai donc mis l'élément de conseil au début de la liste. et masquez le premier élément dans la liste déroulante.
définissez la disposition ci-dessous dans @Override getDropDownView () lorsque la position est 0, pour masquer la première ligne d'indication.
R.layout.spinner_hint_list_item_layout:
la source
De plus, il existe une astuce simple pour afficher les valeurs par défaut:
Vous pouvez ajouter une valeur par défaut dans votre liste, puis ajouter toute votre collection à l'aide
list.addAll(yourCollection);
Exemple de code réalisable ici:
J'espère que cela récupérera votre complexité. Bon codage!
la source
Je pense que le moyen le plus simple consiste à créer un élément factice sur l'index 0 en disant "sélectionnez-en un", puis à enregistrer, vérifiez peut-être que la sélection n'est pas 0.
la source
Voici donc mon dernier exemple "all-in" pour un bouton-spinner
Dans activity_my_form.xml
Dans strings.xml
Dans MyFormActivity.java
Enfin j'ai obtenu une taille de police configurable sans premier élément sélectionnable bouton spinner !!! Merci à HRJ
la source
Lors de l'extension
SpinnerAdapter
, vous remplacez deuxView
méthodes de production,getView(int, View, ViewGroup)
etgetDropDownView(int, View, ViewGroup)
. Le premier fournit l'View
inséré dansSpinner
lui - même; le second fournit leView
dans la liste déroulante (comme son nom l'indique). Vous pouvez remplacer legetView(...)
afin que, jusqu'à ce qu'un élément soit sélectionné, il affiche unTextView
contenant une invite; puis, lorsque vous détectez qu'un élément a été sélectionné, vous le modifiez pour afficher unTextView
correspondant à cela.la source
Spinner
tutoriel (qui affiche soi-disant unToast
APRÈS avoir sélectionné un élément) cet OUGHT fonctionne: developer.android.com/resources/tutorials/views/…Pour ceux qui utilisent Xamarin, voici l'équivalent C # de la réponse de aaronvargas ci-dessus.
la source
J'ai également résolu ce problème en utilisant le code suivant. Supposons que vous ayez une liste d'articles, par exemple
Maintenant, nous devons fournir les chaînes à spinner car spinner ne peut pas comprendre l'objet. Nous allons donc créer une nouvelle liste de tableaux avec des éléments de chaîne comme celui-ci ->
Nous avons maintenant une
itemStringArrayList
liste de tableaux avec deux éléments de chaîne. Et nous devons afficher le texte "Select Item" comme premier élément. Nous devons donc insérer une nouvelle chaîne dans leitemStringArrayList
.Nous avons maintenant une liste de tableaux
itemsArrayList
et nous voulons afficher deux éléments dans la liste déroulante. Mais la condition ici est ... Si nous ne sélectionnons rien alorsSelect Item
devrait apparaître comme premier élément qui ne sera pas activé.Nous pouvons donc implémenter cette fonctionnalité comme ceci. Si vous devez charger les éléments de la liste de tableaux dans le spinner Android. Vous devrez donc utiliser un adaptateur. Alors ici, je vais utiliser le
ArrayAdapter
. Nous pouvons également utiliser l'adaptateur de personnalisation.Ici dans ce code. nous utilisons la disposition de spinner personnalisée, c'est-à-dire
R.layout.spinner_item
. C'est une simple vue texteNous devons désactiver le premier texte dans le spinner. Donc, pour la position 0, nous désactivons le texte. Et nous pouvons également définir la couleur en remplaçant la méthode getDropDownView. Donc, de cette façon, nous obtiendrons le spinner attendu.
la source
Je voudrais juste utiliser un RadioGroup avec RadioButtons si vous n'avez que trois choix, vous pouvez les faire tous décochés au début.
la source
Aucune des réponses soumises précédemment n'a vraiment fonctionné comme je voulais résoudre ce problème. Pour moi, la solution idéale fournirait le "Select One" (ou tout autre texte initial) lorsque le spinner est affiché pour la première fois. Lorsque l'utilisateur appuie sur la double flèche, le texte initial ne doit pas faire partie de la liste déroulante qui s'affiche.
Pour compliquer davantage ma situation particulière, mes données de spinner viennent d'un curseur qui est chargé via les rappels LoaderManager.
Après une expérimentation considérable, j'ai trouvé la solution suivante:
la source
Je gère cela en utilisant un bouton au lieu d'un Spinner. J'ai l'exemple de projet sur GitHub.
Dans le projet, j'affiche le Spinner et le bouton pour montrer qu'ils sont effectivement identiques. À l'exception du bouton, vous pouvez définir le texte initial comme vous le souhaitez.
Voici à quoi ressemble l'activité:
REMARQUE: Oui, je me rends compte que cela dépend du thème appliqué et l'apparence sera légèrement différente si vous utilisez Theme.Holo. Cependant, si vous utilisez l'un des thèmes hérités tels que Theme.Black, vous êtes prêt à partir.
la source
si vous rencontrez ce problème lorsque vos éléments sont remplis à partir du curseur de la base de données ,
la solution la plus simple que j'ai trouvée dans cette réponse SO:
utilisez UNION dans votre requête d'adaptateur de curseur et ajoutez l'élément supplémentaire avec id = -1 au résultat de la requête, sans vraiment l'ajouter à la base de données:
quelque chose comme:
si l'élément sélectionné est -1, alors c'est la valeur par défaut. Sinon, c'est un enregistrement de la table.
la source
Semble une solution banale, mais je mets généralement simplement un TextView à l'avant du spinner. L'ensemble du Xml ressemble à ceci. (hé les gars, ne me tirez pas dessus, je sais que certains d'entre vous n'aiment pas ce genre de mariage):
Ensuite, je cache le TextView lorsqu'un élément a été sélectionné. De toute évidence, la couleur d'arrière-plan du TextView doit être la même que celle du Spinner. Fonctionne sur Android 4.0. Je ne sais pas sur les anciennes versions.
Oui. Parce que le Spinner appelle setOnItemSelectedListener au début, le masquage de la vue de texte peut être un peu délicat, mais peut être fait de cette façon:
la source
pour moi, cela a fonctionné quelque chose comme ça. a l'amélioration qui ne modifie que le texte dans CERTAINES options, pas du tout.
Tout d'abord, je prends les noms du spinner et crée l'adaptateur de tableau avec une vue personnalisée, mais cela n'a plus d'importance maintenant, la clé remplace le getView et change à l'intérieur les valeurs que vous devez changer. Dans mon cas, c'était seulement le premier, le reste je laisse l'original
la source
voici un simple
la source
Reportez-vous à l'une des réponses ci-dessus: https://stackoverflow.com/a/23005376/1312796
J'ai ajouté mon code pour corriger un petit bug. Celui où aucune donnée n'a été récupérée .. Comment afficher le texte d'invite ..!
Voici mon astuce ... Cela fonctionne très bien avec moi. !
Essayez de placer votre spinner dans un Relative_layoutet alignez un Textview avec votre spinner et jouez avec la visibilité du Textview (SHOW / HIDE) chaque fois que l'adaptateur du spinner est chargé ou vide .. Comme ceci:
Voici le code:
appeler cette méthode après et avant que l'adaptateur de spinner soit chargé et vide.
la source