Après avoir utilisé la bibliothèque de support de conception Android TextInputLayout
pour placer une étiquette flottante au-dessus d'un EditText
composant, je me demandais s'il existe un moyen d'ajouter une étiquette flottante au Spinner
composant (pas nécessairement en utilisant la bibliothèque de conception).
Par cela, je veux dire quelque chose comme un TextView
placé au-dessus du Spinner
(évidemment pas d'animations comme le TextInputLayout
), mais je veux que la tailleTextInputLayout
du texte, la police et la couleur correspondent à celles de l' étiquette flottante du .
Par exemple, cela ressemblerait à quelque chose comme ceci (voir les étiquettes au-dessus des Spinner
s):
Comme je l'ai mentionné précédemment, mon objectif principal est d'avoir une étiquette au-dessus du Spinner
, tout comme dans le TextInputLayout
- donc la taille du texte, la police, la couleur et les distances entre l'étiquette et le composant seraient les mêmes.
Sur la page Google Design concernant les champs de texte d'étiquette flottante , il y a un diagramme montrant les dimensions de l'étiquette par rapport au composant, mais il n'y a aucune indication sur la couleur ou la taille du texte de l'étiquette:
Donc, pour résumer, je demande:
- S'il y a un composant spécial pour réaliser ce que je demande ou une vue personnalisée que je peux utiliser, quel serait-il et comment puis-je l'utiliser.
- Sinon, quelle est la taille, la couleur et la police du texte de l'étiquette flottante, afin que je puisse placer un TextView
au-dessus de mon Spinner
avec les dimensions de mise en page indiquées dans l'image ci-dessus.
ÉDITER:
D'après les directives Google Design pour les champs de texte , il contient les éléments suivants pour les libellés flottants:
Astuce et police d'entrée: Roboto Regular 16sp
Police d'étiquette: Roboto Regular 12sp
Hauteur de la tuile: 72dp Rembourrage du
haut et du bas du
texte: 16dp Rembourrage du séparateur de champ de texte: 8dp
ainsi que les images ci-dessus.
La police d'étiquette flottante est donc: Roboto Regular 12sp . Vous pouvez donc utiliser a TextView
pour afficher l' Spinner
étiquette car je ne connais pas de View
composants personnalisés ou spéciaux que vous pourriez utiliser.
Cependant , après l'avoir essayé, il n'a pas l'air aussi bon que l'exemple montré dans l'image. Une vue personnalisée peut être meilleure pour cela , car elle pourrait paraître plus jolie, mais la solution ci-dessus n'est qu'une façon d'obtenir quelque chose de proche de ce que je voulais à l'origine.
la source
<item name="android:textColor">?android:textColorHint</item>
dans votre style pour obtenir la même couleur de texte dans l'étiquette personnalisée que celle utilisée dans TextInputLayout dans un état non focalisé.SpinnerLabel
au lieu deInputLabel
afin de ne les utiliser que pour les fileurs.J'ai une idée essentielle pour résoudre le même problème que vous.
Vérifiez-le:
https://gist.github.com/rodrigohenriques/77398a81b5d01ac71c3b
Maintenant, je n'ai plus besoin de fileurs. Vous aurez toujours un effet d'étiquette flottante avec des animations incluses.
la source
setInputType(InputType.TYPE_NULL);
à laonDraw(canvas)
méthode pour désactiver toute entrée dans l'edittext. Sinon, par exemple, de longs clics feront apparaître un menu contextuel et permettront à l'utilisateur de coller du texte.EditText
ouAppCompatEditText
, s'il vous plaît!J'ai réalisé cela en utilisant un AutoCompleteTextView, en désactivant le clavier et en affichant les options au toucher.
la source
TextInputLayout
, vous assurant ainsi d'avoir exactement l'apparence correcte.R.layout.support_simple_spinner_dropdown_item
place deandroid.R.layout.simple_spinner_item
mTextView.setText(...)
, vous ne recevrez pas toutes les valeurs de l'adaptateur dans la liste déroulante ... L'appeladapter.getFilter().filter(null);
affiche à nouveau toutes les suggestionsJ'ai créé un
View
composant composé qui affiche une étiquette au-dessus duSpinner
. Le texte de l'étiquette peut être défini à l'aide de XML ou en Java.Le composant présente les principales caractéristiques d'un
Spinner
( pas tous ) et ressemble auTextInputLayout
composant.Je l'ai nommé a
LabelledSpinner
, et il est disponible dans le cadre de ma bibliothèque Android UsefulViews sur GitHub sous la licence Apache 2.0 .Pour l'utiliser, ajoutez la dépendance de bibliothèque dans votre
build.gradle
fichier:Des exemples de son utilisation sont disponibles dans le référentiel GitHub (à la fois un exemple d'application et un guide d'utilisation).
la source
Spinner
, qui est similaire à la façon dont il y a de petites étiquettes au-dessus desEditText
composants, enveloppées dansTextInputLayout
. Comment l'avez-vous imaginé?J'ai modifié la solution de Rodrigo pour utiliser un adaptateur, c'est à dire plus comme un Spinner standard https://gist.github.com/smithaaron/d2acd57937d7a4201a79
la source
J'ai une solution alternative qui utilise le comportement de TextInputLayout et un DialogFragment personnalisé (AlertDialog) pour émuler une fenêtre contextuelle de dialogue spinner.
layout.xml:
Créer un spinner personnalisé via DialogFragment (AlertDialog)
SpinnerFragment.java:
}
Activity.java:
Résultat
Lorsque vous cliquez sur le spinner stylisé TextInputLayout, il déclenchera une boîte de dialogue d'alerte contenant votre liste de sélections. Une fois qu'une sélection est choisie, le EditText sera rempli avec votre sélection et l'étiquette flottera comme vous le souhaitez.
la source
android:focusable="false"
rend- il pas cette vue inaccessible à ceux qui utilisent le clavier ou la voix pour interagir avec l'application?android:focusable="false"
est que l'utilisateur ne peut pas taper une entrée qui ne fait pas partie de la sélection. Malheureusement, je n'ai pas de téléphone Android physique pour tester les comportements et vous en informer.Voici mon truc,
la bonne chose est que tout fonctionnera comme vous le souhaitez,
mais le problème est que cela augmente la hiérarchie de la mise en page, et vous devez gérer les fonctionnalités dans le code, et c'est une solution moche:
et remplacer l'adaptateur pour le spinner, pour rendre les valeurs sélectionnées transparentes
et après avoir sélectionné dans le spinner, obtenez simplement le texte sélectionné et réglez-le sur EditText et il aura le même effet avec l'animation
si vous avez des questions posez-moi
la source
Vous pouvez y parvenir:
Avec de nouveaux styles de bibliothèque de matériaux comme celui-ci:
pour plus d'informations: https://material.io/develop/android/components/menu/
la source
Voici une bibliothèque que j'utilise pour le spinner d'étiquettes flottantes rey5137 Material Library
Aussi, pour référence future, voici une liste de quelques grandes bibliothèques. Bibliothèques d'interface utilisateur Bibliothèques principales
la source
SpinnerCustom.java
layout_spinner_custom.xml
style.xml
la source