Comment faire un Android Spinner avec du texte initial “Sélectionnez l'Un”?
Je veux utiliser un Spinner qui, à l'origine (lorsque l'utilisateur n'a pas fait une sélection encore) affiche le texte "Sélectionnez l'Un". Lorsque l'utilisateur clique sur la touche de navigation, la liste des articles est affichée et l'utilisateur sélectionne l'une des options. Après que l'utilisateur a effectué une sélection, l'élément sélectionné est affiché dans le compteur 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, d'abord l'article "Un" est affiché. Je pourrais juste ajouter un nouvel élément "Sélectionner" pour les articles, mais puis "Sélectionner Un" serait également affiché dans la liste déroulante, comme premier élément, qui n'est pas ce que je veux.
Comment puis-je résoudre ce problème?
- Solution idéale réside dans cette question : stackoverflow.com/questions/9863378/... Juste remplacer getDropDownView() la méthode.
- Avez-vous essayé le premier élément de votre adaptateur pour "Sélectionner Un"?
- [Ici, autre grande solution sympa!][1] [1]: stackoverflow.com/questions/9863378/...
- réutilisable spinner : github.com/henrychuangtw/ReuseSpinner
- android--code.blogspot.in/2015/08/android-spinner-hint.html un autre bon tutoriel
Vous devez vous connecter pour publier un commentaire.
Voici une solution qui remplace la
Spinner
vue. Il remplacesetAdapter()
pour définir la position initiale à -1, et de procuration 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 l'acheteur méfiez-vous! Parce que cette solution s'appuie sur la réflexion pour appeler le privé
AdapterView.setNextSelectedPositionInt()
etAdapterView.setSelectedPositionInt()
, il n'est pas garanti pour fonctionner dans les futures mises à jour OS. Il semble probable qu'il sera, mais il n'est pas garanti.Normalement je n'aurais pas fermer les yeux sur quelque chose comme cela, mais cette question a été posée assez de temps et il semble assez raisonnable de demander que je pensais que j'allais poster ma solution.
private ArrayAdapter<CharSequence> createSpinnerAdapterFromArray(int arrayResource){ ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), arrayResource, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); return adapter; }
Cannot resolve symbol 'SpinnerAdapterProxy'
. Que dois-je faire?NoDefaultSpinner
étendreAppCompatSpinner
si vous êtes à l'aide de la appcompat de la bibliothèque.Ce que vous pouvez faire est de décorer votre
SpinnerAdapter
avec celui qui présente une 'Sélectionnez l'Option' Afficher à l'origine pour la touche de navigation pour afficher si rien n'est sélectionné.Voici un exemple de travail a testé pour Android 2.3 et 4.0 (il utilise rien dans la bibliothèque de compatibilité, de sorte qu'il devrait être bon pour un certain temps) Car c'est l'un décorateur, il devrait être facile de remplacer le code et il fonctionne très bien avec
CursorLoader
s aussi. (Swap curseur sur le enveloppéscursorAdapter
bien sûr...)Il y a un Android bug qui le rend un peu plus difficile à ré-utiliser les vues. (Vous devez pour cela utiliser la
setTag
ou quelque chose d'autre pour assurer votreconvertView
est correct). Spinner ne prend pas en charge plusieurs types de vuesNotes de Code: 2 constructeurs
Cela vous permet d'utiliser une norme de commandes ou définir votre propre 'rien n'est sélectionné" dans la première ligne, ou les deux, ou aucun. (Remarque: Certains thèmes afficher un menu Déroulant pour un Spinner au lieu d'une boîte de dialogue. La liste Déroulante n'a pas l'habitude d'afficher l'invite de commandes)
Vous définissez une mise en page à "regarder" comme une invite, par exemple, grisé...
L'aide d'une invite de commande (notez que rien n'est sélectionné):
Ou une invite et quelque chose de dynamique (qui peut avoir eu aucune invite également):
L'utilisation dans l'exemple ci-dessus
contact_spinner_row_nothing_selected.xml
NothingSelectedSpinnerAdapter.java
layout_width
attributwrap_content
et de définir un remplissage à droite (j'ai utilisé50dp
) afin d'avoir le même effet visuel que d'un réel spinner pour leTextView
utilisé comme la sélection; sinon, leTextView
est à risque de développer la droite et de mettre le fond de la flèche hors de la vue.NothingSelectedSpinnerAdapter.getCount() {return adapter.getCount() + EXTRA;}
contact_spinner_row_nothing_selected.xml
fichier dans mon projet. Comment est-il possible de passer une chaîne de caractères et modifier le"[Select a Planet...]"
(android.text)
pour chaque spinner, Par exemple une plus être"Select City"
et d'autres"Select Country"
city_spinner_nothing_selected_row.xml
etcountry_spinner_nothing_selected_row.xml
. Définir le texte correct dans chaque fichier et l'utiliser dans vos toupies.J'ai fini à l'aide d'un
Button
à la place. Alors qu'unButton
n'est pas unSpinner
, le comportement est facile à personnaliser.D'abord créer la Carte comme d'habitude:
Noter que je suis en utilisant le
simple_spinner_dropdown_item
que la mise en id. Cela aidera à créer un look lors de la création de la boîte de dialogue d'alerte.Dans le onClick gestionnaire pour mon Bouton, j'ai:
Et c'est tout!
Je sais que cette question a beaucoup de Réponse, mais j'ai trouvé la plus simple et la meilleure façon de le faire.
Cette solution est indépendante de l'API de niveau ,ça fonctionne pour toutes les API de niveau.
Idée est de mettre le dernier élément de spinner en tant que par défaut..c'est à dire
Élément au dernier indice devrait être votre Titre de spinner comme "Sélectionner le Pays"
Et pendant le remplissage de la toupie de diminuer le nombre de point par un.j'.e
//Décompte commence à partir de 1 à total de l'élément.
De sorte que votre flux de code sera comme ceci
HintAdapter.java
Spinner Titre
Spinner Élément
.setSelection(adapter.getCount())
) se cachent de la pointe aussi. Avez-vous une autre recommandation sur la manière d'arriver à ce résultat ?Note
:Indicateur doit être le dernier élément et getCount() doit être exactement ce que j'ai écrit.Je l'ai utilisé dans plusieurs projets et il fonctionneSelect State
etSelect City
. Initialement, la ville spinner est vide, je viens d'ajouter un objetobjects.add("Select City");
mais il ne montre cet objet sélectionné. Mais quand j'ai ajouter plusieurs objets à la ville spinner, il affiche le texte par défaut. Comment puis-je le faire fonctionner dans le cas où il y a juste la valeur par défaut", sélectionnez " texte dans l'objet de collection??notifyDataSetChanged()
.. ;/AbsSpinner
'sonMeasure()
, il y a une case pourselectedPosition < mAdapter.getCount()
, qui échoue et puis le Spinner point de vue n'est pas mesuré correctement.List<Object> objects
devrait êtreList<Objects> objects
HintAdapter<T> extends ArrayAdapter<T>
Première, vous pourriez être intéressé par le
prompt
attribut de laSpinner
classe. Voir l'image ci-dessous, "Choisir une Planète" est l'invite de commandes qui peut être défini dans le fichier XML avecandroid:prompt=""
.J'allais suggérer des sous-classement
Spinner
, où l'on pouvait maintenir les deux cartes en interne. Une carte qui a la "Sélectionnez Une option", et l'autre réel adaptateur (avec les options), puis à l'aide de laOnClickListener
pour passer les cartes avant de les choix de dialogue est affichée. Cependant, après avoir essayé de mettre en œuvre cette idée, je suis venu à la conclusion que vous ne peut pas recevoirOnClick
événements pour le widget lui-même.Vous pouvez rassembler le spinner un point de vue différent, d'intercepter les clics sur la vue, et puis, dites à votre
CustomSpinner
pour commuter la carte, mais semble comme une terrible hack.Avez-vous vraiment besoin de montrer "Sélectionnez l'Un"?
Ce code a été testé et fonctionne sur Android 4.4
getItem(getCount())
est souligné en rouge pour moi? Ne peut pas résoudre méthode setHintJ'ai trouvé cette solution:
Il suffit de changer le tableau[0] avec "Select" et puis dans le onItemSelected, le renommer en "Un".
Pas une classe de la solution, mais ça marche 😀
Il n'y a pas de valeur par défaut de l'API pour définir des indices sur Spinner. Pour l'ajouter, nous avons besoin d'une petite solution de contournement avec que ce n'est pas la sécurité de la réflexion de la mise en œuvre
Adaptateur source:
Original source
android.R.id.text1
getCount
méthodeBeaucoup de réponses ici, mais je suis surpris que personne n'a suggéré une solution simple: Placez un TextView sur le dessus de la casserole. Définir un écouteur de clics sur le TextView qui cache le TextView montre le compteur, et les appels spinner.performClick().
J'ai eu le même problème pour spinner, avec un vide de sélection, et j'ai trouvé une meilleure solution. Jetez un oeil à ce simple code.
Ici spinneradapter est une petite personnalisation pour arrayadapter. Il ressemble à ceci:
Fichier XML:
Activité:
onCreate:
Une certaine fonction (ajouter des choses à la carte par programmation)>
Maintenant, vous avez un vide spinner et vous pouvez écrire du code pour ne pas ouvrir la boîte de dialogue si vide. Ou ils peuvent appuyer sur la touche back. Mais vous pouvez aussi le remplir avec une fonction ou une autre liste au moment de l'exécution.
Vous pouvez le remplacer par un Texte de Visualiser et d'utiliser ce:
et ensuite définir le
android:text
propriété.J'ai essayé comme suit. Prenez un bouton et donner à l'événement click pour elle. En changeant l'arrière-plan du bouton, il semble être un spinner.
Déclarer des variables globales alertdialog et la valeur par défaut..
C'est ma façon:
Prendre un coup d'oeil à la iosched application pour un usage général, la solution pour l'ajout d'un élément au sommet de la liste. En particulier, si vous utilisez un CursorAdapter, regardez TracksAdapter.java qui s'étend cette définition, pour donner une "setHasAllItem" la méthode et le code associé à la gestion de la liste comte de traiter avec l'élément supplémentaire dans la partie supérieure.
À l'aide de l'adaptateur personnalisé vous pouvez définir le texte à "Sélectionner" ou tout autre chose que vous pouvez vouloir que le point haut à dire.
J'ai un compteur sur mon main.xml et son id est
@+id/spinner1
c'est ce que j'écris dans ma fonction OnCreate :
Il n'a pas besoin de mise en œuvre dans la classe.
J'ai trouvé beaucoup de bonnes solutions pour cela. la plupart travaille en ajoutant un élément à la fin de la carte, et de ne pas afficher le dernier élément dans la liste déroulante.
Le gros problème pour moi a été le spinner liste déroulante à partir du bas de la liste. De sorte que l'utilisateur voir les derniers articles à la place des premiers éléments (dans le cas d'avoir beaucoup d'articles à afficher), après touchez la touche de navigation pour la première fois.
Alors j'ai mis de l'indice de l'élément au début de la liste. et cacher le premier élément dans la liste déroulante.
définir la mise en page ci-dessous dans @Override getDropDownView() quand la position est 0, pour cacher la moindre ligne.
R. layout.spinner_hint_list_item_layout:
Je pense que le plus simple est de créer un mannequin élément d'index 0 disant: "sélectionnez l'une" et ensuite sur l'épargne peut-être vérifier que la sélection n'est pas 0.
Donc c'est 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 configurables pas premier élément sélectionnable bouton toupie!!!
Grâce à HRJ
Lors de l'extension de
SpinnerAdapter
, vous remplacez les deuxView
-produisant des méthodes,getView(int, View, ViewGroup)
etgetDropDownView(int, View, ViewGroup)
. Le premier fournit leView
inséré dans leSpinner
lui-même; le second fournit lesView
dans la liste déroulante (comme son nom l'indique). Vous pouvez remplacer legetView(...)
de sorte que, jusqu'à ce qu'un élément a été sélectionné, il affiche unTextView
contenant une invite; ensuite, si vous constatez qu'un élément a été sélectionné, vous la modifier pour afficher uneTextView
correspondant à cette.Spinner
tutoriel (qui, soit disant, affiche unToast
APRÈS avoir sélectionné un élément), ce qui DEVRAIT fonctionner: developer.android.com/resources/tutorials/views/...Pour ceux qui utilisent Xamarin, ici, c'est le C# équivalent à aaronvargas la réponse ci-dessus.
J'ai aussi résolu ce problème en utilisant le code suivant. Supposons que vous avez une liste d'éléments, par exemple
Maintenant, nous devons fournir les chaînes de spinner parce que la toupie ne peut pas comprendre l'objet. Nous allons donc créer une nouvelle liste de tableau avec des éléments de chaîne comme this ->
Maintenant, nous avons
itemStringArrayList
tableau liste à deux éléments de chaîne. Et nous devons montrer le "Sélectionner un Élément de texte" comme premier élément. Nous avons donc d'insérer une nouvelle chaîne dans leitemStringArrayList
.Maintenant, nous avons une liste de tableau
itemsArrayList
et nous voulons montrer que deux éléments dans le menu déroulant. Mais la condition est que ...Si nous ne sélectionnons pas rien, alorsSelect Item
doit apparaître comme premier élément qui ne sera pas activé.Afin que nous puissions mettre en œuvre cette fonctionnalité de ce genre. Si vous avez besoin de charger le tableau des éléments de liste dans le android spinner. Ainsi, vous aurez à utiliser une carte. Donc ici, je vais utiliser le
ArrayAdapter
. Nous pouvons utiliser le personnaliser avec adaptateur.Ici dans le présent code. nous sommes à l'aide de l'personnalisé spinner mise en page c'est à dire
R.layout.spinner_item
. C'est un texte simple vueIl faut désactiver le premier texte dans la casserole. Donc pour la position 0, nous sommes en désactivant le texte. Et la couleur aussi, nous pouvons définir par overiding getDropDownView méthode. Donc, dans cette façon, nous obtiendrons le devrait spinner.
En outre, Il y a un truc simple pour afficher par défaut:
Vous pouvez ajouter une valeur par défaut dans votre liste, puis ajouter la totalité de votre collection à l'aide de
list.addAll(yourCollection);
De l'échantillon exploitable code ici:
Espère que c'est de récupérer vos complexité. Amusez-vous bien!
Je venais d'utiliser un groupe de boutons avec des composants radiobutton si vous ne disposez que de trois choix, vous pouvez faire tout décoché au premier abord.
Aucun précédemment ont présenté des réponses vraiment fonctionné comme je le voulais pour résoudre ce problème. Pour moi, la solution idéale serait de permettre de Sélectionner Un” (ou quel que soit le texte initial) lorsque le compteur est affiché pour la première fois. Lorsque l'utilisateur appuie sur la touche de navigation, le texte initial ne devrait pas être une partie de la liste déroulante qui s'affiche.
Pour compliquer ma situation, mon spinner données provenant d'un curseur qui est chargé par la LoaderManager rappels.
Après de nombreuses expérimentations, je suis venu avec la solution suivante:
- Je les traiter à l'aide d'un bouton au lieu d'un Spinner. J'ai l'exemple de projet sur GitHub.
Dans le projet, je suis en affichant à la fois la touche de navigation et le bouton pour montrer qu'en effet, ils ont l'air identiques. À l'exception du bouton, vous pouvez définir le texte initial de ce que vous voulez.
Voici ce que l'activité est:
REMARQUE: Oui, je me rends compte que c'est dépendante sur le Thème et le look sera légèrement différente si vous utilisez le Thème.Holo. Toutefois, si vous utilisez l'un de l'héritage des thèmes comme Thème.Noir, vous êtes bon pour aller.
si vous êtes confrontés à ce problème si vos articles sont renseignées à partir de la base de données curseur,
la solution la plus simple que j'ai trouvé dans cette DONC réponse:
utiliser de l'UNION dans votre curseur adaptateur requête et ajouter l'élément supplémentaire avec l'id= -1 pour le résultat de la requête, sans vraiment ajouter à la DB:
quelque chose comme:
si l'élément sélectionné est de -1, alors c'est la valeur par défaut. Autrement
c'est un enregistrement de la table.
Semble banale, mais j'ai l'habitude de mettre simplement un TextView à l'avant de la fileuse. L'ensemble de Xml ressemble à ceci. (hé les gars, ne pas tirer sur moi, je sais que certains d'entre vous n'aime pas ce genre de mariage):
Puis-je cacher le TextView lorsqu'un Élément a été sélectionné. Évidemment, la couleur de fond de la TextView doit être le même que le Spinner. Fonctionne sur Android 4.0. Ne sais pas sur les anciennes versions.
Oui. Parce que le Spinner appels setOnItemSelectedListener au début, la dissimulation de la textview pourrait être un peu difficile, mais peut être fait de cette façon:
pour moi, il a travaillé quelque chose comme ça. a l'amélioration que seules les modifications du texte dans CERTAINES options, pas dans tous.
J'ai d'abord prendre le nom de la toupie et de créer de la arrayadapter avec une personnalisation de l'affichage, mais il n'a pas d'importance maintenant, la clé est de remplacer la getView, et à l'intérieur de modifier les valeurs u besoin de changer. Dans mon cas, n'était que le premier, le reste je laisse la d'origine
voici un simple
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. Que l'absence de données récupérées..Comment faire pour afficher le texte de l'invite..!
Ici, c'est mon Truc...Il fonctionne très bien avec moi. !
Essayez de mettre votre spinner dans un Relative_layoutand aligner un Textview avec votre spinner et de jouer avec la visibilité de la Textview (AFFICHER/MASQUER) chaque fois que l'adaptateur de la spinner chargé ou vide..Comme ceci:
Voici le code:
appeler cette méthode avant et après spinner adaptateur chargés et vides.
pour le rendre facile comme cela:
J'ai été confrontée au même problème hier et n'a pas envie d'ajouter un élément masqué à la ArrayAdapter ou de l'utilisation des réflexions, qui fonctionne très bien mais est une sorte de sale.
Après avoir lu de nombreux posts et d'essayer, j'ai trouvé une solution en étendant
ArrayAdapter
et en remplaçant lagetView
méthode.Ce que Android n'est lors de l'initialisation de la Toupie, est l'appel de getView pour l'élément sélectionné avant d'appeler getView tous les éléments de la
T[] objects
.Le
SpinnerAdapterWithInitialText
renvoie uneTextView
avec leinitialText
, la première fois qu'elle est appelée.Toutes les autres fois il appelle
super.getView
qui est legetView
méthode deArrayAdapter
qui est appelé si vous êtes à l'aide de la touche de navigation normalement.Pour savoir si l'utilisateur a sélectionné un spinner article, ou si le compteur affiche toujours le
initialText
, appelselectionMade
et remettre la casserole de la carte est attribuée.Envisager Il y a N éléments sélectionnés.
Après l'ajout de ces N éléments, ajouter le texte d'instruction en tant que (N+1)ème élément.
Régler l'élément sélectionné à la Nième position [(N+1)ème élément].
Dans votre OnItemSelected Auditeur, si la position sélectionnée n'est pas N, pop le dernier élément et l'appel de l'Adaptateur.notifyDataSetChanged() et réglez l'élément sélectionné comme la position sélectionnée.
Quelque chose comme ceci:
Simplement utiliser arraylist.add("Vos Données") la méthode pour ajouter un élément à la fin de arrayList, puis il suffit de l'inverser à l'aide de la Collection.inverse(arrayList), de sorte que le Titre soit le 1er Élément de Spinner. Vous pouvez également trier l'élément avant d'ajouter les données à la fin.