Je voudrais créer un EditText qui accepte uniquement des nombres, a un maximum de 4 chiffres et n’est jamais plus étroit qu’il serait si rempli avec 4 chiffres fixé.)
Les 2 premiers sont réalisés avec: Android: inputType = "number" et Android: maxLength = "4".
Comment puis-je définir la longueur minimale?
Un peu hackish , mais vous pouvez mettre votre EditText
dans une FrameLayout
avec une autre TextView
avec text="0000"
et visibility=invisible.
FrameLayout
Doit avoir width=wrap_content
et votre EditText
aura width=match_parent
.
Cela devrait toujours faire la bonne largeur.
L'avantage de ceci est qu'il est 100% xml-side, sans code impliqué.
<FrameLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content">
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="0000"
Android:visibility="invisible" />
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:inputType="number"
Android:maxLength="4" />
</FrameLayout>
Un attribut rarement utilisé (AFAIK) d'un EditText que vous pouvez utiliser est:
Android:ems="4"
Cela rend le EditText exactement 4 ems large. Une largeur em est la largeur du caractère le plus large (M) de la police sélectionnée.
Dans ma situation, j'avais besoin que la vue soit large de 6 chiffres. Android: ems a créé un champ trop large (le caractère M étant plus large qu'un chiffre).
J'ai fini par utiliser un indice transparent qui dicte la largeur minimale du champ. L'exemple ci-dessous est large de six chiffres.
<EditText
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:hint="000000"
Android:textColorHint="#00FFFFFF"
Android:maxLength="6"
Android:inputType="numberPassword" />
Cette solution est indépendante de la police, de l’espacement des lettres et de tout autre facteur pouvant varier. TextColorHint est une couleur blanche opaque à 0%; par conséquent, le conseil ne doit jamais être visible pour l'utilisateur.
Vous pouvez également essayer d'utiliser. . .
Android:ems="4"
Android:maxEms="4"
Android:layout_width="wrap_content"
. . . cela devrait assurer l'ajustement le plus étroit éventuellement permis par le style edittext Android par défaut
Pour un contrôle supplémentaire avec le rembourrage à gauche et à droite, vous pouvez utiliser
Android:background="#ffffff"
Android:paddingLeft="0dp"
Android:paddingRight="0dp"
Utilisez Android: width = "XXX.Xdp"
Cela vous permet de définir la largeur en pixels de densité qui doit être relative à la densité de l'écran. J'ai essayé d'utiliser des ems basés sur un champ de 2 caractères, mais comme ems nécessite un int, 2 était trop petit et 3 trop grand. Blech.
Il existe un moyen incroyablement facile de le faire par programme.
myEditText.setLayoutParams(new LinearLayout.LayoutParams(200, 50));
Cela réglerait la largeur à 200 et la hauteur à 50 !!
Prendre plaisir :)
Vous pouvez définir l'alignement autrement lorsque vous mettez un caractère supérieur à la largeur de wditText à la largeur d'augmentation ou à la largeur d'EditText . Définissez les options toGeftOf et toRightOf de la vue ci-dessus pour gérer ces éléments. Une seule solution
Vous ne connaissez pas la solution intégrée, mais vous pouvez essayer de vérifier passivement la longueur et d'afficher un dialogue avec message d'erreur au moment de la soumission.
Le problème est qu'un widget EditText peut perdre le focus en raison de nombreuses actions différentes, telles que le fait de toucher une autre vue sensible, un bouton de menu ou (contrôle du curseur au clavier), etc. La restiction d'une longueur maximale ou du type de l'entrée peut être effectuée pendant le processus de rattachement (acceptez le caractère s'il passe le filtre ou si la longueur n'est pas dépassée). mais la focalisation perdue peut être occasionnelle à chaque fois - même la soumission n'est pas encore terminée et l'entrée est abrégée -> il n'y a donc pas de solution de longueur minimale intégrée, car l'application bloquerait à ce stade l'exécution d'un autre événement ou d'une autre tâche. Au moins, vous devez valider votre saisie avant de passer à la prochaine étape de votre flux de travail.
J'utilise Android: layout_width = "60dip", donc d'accord avec Mike Fratto.
La solution ems semble également intéressante.
Phil