Dans Android EditText, comment forcer l'écriture en majuscules?


144

Dans mon application Android, j'ai différents EditTextendroits où l'utilisateur peut entrer des informations. Mais je dois forcer l'utilisateur à écrire en majuscules. Connaissez-vous une fonction pour faire cela?

Réponses:


340

Android a en fait un InputFilter intégré juste pour cela !

edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});

Attention, setFilters remet tous les attributs qui ont été définis par XML (c. -à maxLines, inputType, imeOptinos...). Pour éviter cela, ajoutez votre (vos) filtre (s) à ceux déjà existants.

InputFilter[] editFilters = <EditText>.getFilters();
InputFilter[] newFilters = new InputFilter[editFilters.length + 1];
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
newFilters[editFilters.length] = <YOUR_FILTER>;  
<EditText>.setFilters(newFilters);

3
Oui! C'est la meilleure réponse! Le code devrait être edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});bien.
Arthur

4
OK, vous aviez raison, j'ai mis à jour ma réponse. Merci d'avoir aidé à améliorer cela !!
ErlVolton

4
Pour éviter les remplaçant filtres définis sur xml (pour par exemple. maxLength), Essayer d'ajouter la InputFilter.AllCaps()à editText.getFilterstableau. Voir stackoverflow.com/a/18934659/3890983
tropicalfish

21
Ou à Kotlin justeeditText.filters = editText.filters + InputFilter.AllCaps()
Ilia Kurtov

4
Mieux encore: editText.filters += InputFilter.AllCaps()Kotlin est merveilleux! <3
Milack27

123

Si vous voulez forcer l'utilisateur à écrire en majuscules par défaut dans votre EditText, il vous suffit d'ajouter android:inputType="textCapCharacters". (L'utilisateur peut toujours passer manuellement en minuscules.)


39
rien n'empêche l'utilisateur d'appuyer sur «shift» et d'écrire une lettre en minuscule.
Fernando Leal

D'accord avec Fernando, bien que le clavier soit par défaut en majuscules, il n'en a pas besoin.
pforhan le

L'utilisateur peut utiliser le bouton Maj pour saisir une minuscule comme indiqué par @Fernando
Ajinkya

24

Réglez le input typesur TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS. Le keyboarddevrait honorer cela.


android: inputType = "textCapCharacters"
Parth Kapoor

18

Vous pouvez utiliser deux méthodes.

Première manière:

Réglez android:inputType="textCapSentences"votre EditText.

Deuxième manière:

Lorsque l'utilisateur entre le numéro, vous devez utiliser l'observateur de texte et changer la petite en majuscule.

edittext.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {            

    }
        @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {             
    }
    @Override
    public void afterTextChanged(Editable et) {
          String s=et.toString();
      if(!s.equals(s.toUpperCase()))
      {
         s=s.toUpperCase();
         edittext.setText(s);
         edittext.setSelection(edittext.length()); //fix reverse texting
      }
    }
});  

2
votre solution ne fonctionne pas car elle définit la chaîne dans un ordre inverse.
co2f2e

de quelle manière vous avez utilisé le premier ou le second.
Harshid

Le premier ne fonctionne pas du tout. Le second rend le texte en majuscules mais nous devons placer le curseur par programme à la fin de la phrase.
co2f2e

@Kalanamith ya alors quel est le problème
Harshid

6
Pour la première option textCapSentences capitalise les phrases, vous avez besoin de textCapCharacters.
Ghoti

13

Vous pouvez ajouter la android:textAllCaps="true"propriété à votre fichier xml dans EditText. Cela forcera le clavier d'entrée logicielle à apparaître en mode tout en majuscules. La valeur que vous entrez apparaîtra en majuscules. Cependant, cela ne garantit pas que l'utilisateur ne peut entrer qu'en UpperCaselettres. S'ils le souhaitent, ils peuvent toujours revenir aux lettres minuscules. Si vous voulez vous assurer que la sortie de la Edittextest en majuscules, vous devez alors convertir manuellement la chaîne d'entrée en utilisant la toUpperCase()méthode de la Stringclasse.


@GustavoAlves, pouvez-vous me dire ce qui s'est passé lorsque vous avez essayé ça? Peut-être que je peux examiner votre problème. :)
Abhishek

Salut @Abhishek. La définition de la propriété n'a rien changé. Le EditText accepte toujours les caractères majuscules et minuscules.
Gus Costa

1
Oui, si vous voulez restreindre votre EditText uniquement pour accepter les caractères majuscules, alors pour vous, android: inputType = "textCapCharacters" serait la bonne option. Essayez-le et faites-le moi savoir. ☺️
Abhishek

1
Cela a provoqué une exception d'indexation hors limites à chaque fois que je tapais.
Zapnologica

2
android:textAllCaps="true"est uniquement une propriété de TextView ( stackoverflow.com/a/28803492/5268730 ). Utilisez android:inputType="textCapCharacters"plutôt.
woodii

11

Vous devriez mettre android:inputType="textCapCharacters"avec Edittext dans un fichier xml.


9
AoyamaNanami a écrit exactement la même réponse. Veuillez vous concentrer sur des questions plus actuelles, celle-ci date de 2013. :)
ByteHamster

2
Notez que l'utilisateur peut décaler et entrer des caractères inférieurs
Rafa0809

10

Plutôt que de vous soucier du clavier, pourquoi ne pas accepter n'importe quelle entrée, minuscule ou majuscule et convertir la chaîne en majuscules?

Le code suivant devrait vous aider:

EditText edit = (EditText)findViewById(R.id.myEditText);
String input;
....
input = edit.getText();
input = input.toUpperCase(); //converts the string to uppercase

Ceci est convivial car il est inutile pour l'utilisateur de savoir que vous avez besoin de la chaîne en majuscules. J'espère que cela t'aides.


9

Encore mieux ... une doublure à Kotlin ...

// gets your previous attributes in XML, plus adds AllCaps filter    
<your_edit_text>.setFilters(<your_edit_text>.getFilters() + InputFilter.AllCaps())

Terminé!


2
Vous pouvez l'écrire en utilisant la syntaxe d'accès à la propriété: <your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
Makotosan

8
Mieux encore:<your_edit_text>.filters += InputFilter.AllCaps()
Makotosan

9

Dans kotlin , dans le fichier .kt, apportez des modifications:

edit_text.filters = edit_text.filters + InputFilter.AllCaps()

Utilisez la propriété synthétique pour un accès direct au widget avec identifiant. Et en XML, pour votre texte d'édition, ajoutez quelques indicateurs supplémentaires comme:

<EditText
    android:id="@+id/edit_text_qr_code"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ...other attributes...
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
    />

Cela mettra à jour le clavier en majuscules.


8

Utiliser le filtre d'entrée

editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

6
edittext.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {            

    }
        @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {             
    }
    @Override
    public void afterTextChanged(Editable et) {
          String s=et.toString();
      if(!s.equals(s.toUpperCase()))
      {
         s=s.toUpperCase();
         edittext.setText(s);
      }
      editText.setSelection(editText.getText().length());
    }
});  

6

Faites juste ceci:

// ****** Every first letter capital in word *********
<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textCapWords"
    />

//***** if all letters are capital ************

    android:inputType="textCapCharacters"

5

Essayez d'utiliser l'un des codes ci-dessous pour résoudre votre problème.

par programme:

editText.filters = editText.filters + InputFilter.AllCaps()

XML:

android:inputType="textCapCharacters" with Edittext

4

Pour moi, cela a fonctionné en ajoutant android: textAllCaps = "true" et android: inputType = "textCapCharacters"

<android.support.design.widget.TextInputEditText
                    android:layout_width="fill_parent"
                    android:layout_height="@dimen/edit_text_height"
                    android:textAllCaps="true"
                    android:inputType="textCapCharacters"
                    />

3

Pour obtenir tout le capital, utilisez ce qui suit dans votre XML:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
/>

2
avez-vous essayé cette solution? cela entraîne un plantage de l'application lorsque l'utilisateur commence à modifier le contenu de editext
surhidamatya

3

essayez ce code il fera votre entrée en majuscules

edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});

2

Sur la base de la réponse acceptée, cette réponse fait la même chose, mais à Kotlin. Juste pour faciliter le copypast: ·)

private fun EditText.autocapitalize() {
    val allCapsFilter = InputFilter.AllCaps()
    setFilters(getFilters() + allCapsFilter)
}

1
filters += InputFilter.AllCaps(): D
crgarridos

1

Pour obtenir un clavier en majuscules lorsque vous cliquez sur edittext, utilisez ce code dans votre xml,

<EditText
    android:id="@+id/et"
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:hint="Input your country"
    android:padding="10dp"
    android:inputType="textCapCharacters"
    />

1

J'utilise Visual Studio 2015 / Xamarin pour créer mon application pour Android 5.1 et Android 6.0 (même apk installé sur les deux).

Lorsque j'ai spécifié android:inputType="textCapCharacters"dans mon axml, le clavier AllCaps est apparu comme prévu sur Android 6.0, mais pas sur Android 5.1. J'ai ajouté android:textAllCaps="true"à mon axml et toujours pas de clavier AllCaps sur Android 5.1. J'ai défini un filtre en utilisantEditText.SetFilters(new IInputFilter[] { new InputFilterAllCaps() }); et alors que le clavier virtuel affiche des caractères minuscules sur Android 5.1, le champ de saisie est maintenant AllCaps.

EDIT: Les différences de comportement que j'ai observées et supposées être liées au système d'exploitation étaient en fait parce que j'avais différentes versions de Google Keyboard sur les appareils de test. Une fois que j'ai mis à jour les appareils avec le dernier clavier Google (publié en juillet 2016 au moment de la rédaction de cet article), le comportement `` All Caps '' était cohérent entre les systèmes d'exploitation. Désormais, tous les appareils affichent des caractères minuscules sur le clavier, mais l'entrée est All Caps en raison deSetFilters(new IInputFilter[] { new InputFilterAllCaps() });


1
Salut Tony, il semble que vous ayez créé 2 comptes; stackoverflow.com/users/6764633/tony-celia et stackoverflow.com/users/6771440/deeveedee . Si vous souhaitez les fusionner, consultez stackoverflow.com/help/merging-accounts .
Matt

Merci, Matt. Attachez-le à l'apprentissage / aux erreurs du débutant. Je ne me souviens pas que j'avais créé un autre compte jusqu'à ce que vous le signaliez. heureusement, la fonction de fusion de compte était simple. Super forum!
Tony

1

Équivalent Xamarin de la réponse d'ErlVolton:

editText.SetFilters(editText.GetFilters().Append(new InputFilterAllCaps()).ToArray());

C'est pourquoi j'aime la façon dont C # peut être si concis.
Lionet Chen

1

Réalisation simple de kotlin

fun EditText.onlyUppercase() {
    inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS
    filters = arrayOf(InputFilter.AllCaps())
}

PS pour moi filtersest toujours vide au départ


0

Un Java 1-liner de la solution proposée pourrait être:

editText.setFilters(Lists.asList(new InputFilter.AllCaps(), editText.getFilters())
    .toArray(new InputFilter[editText.getFilters().length + 1]));

Notez qu'il a besoin com.google.common.collect.Lists.


-1

Ajoutez simplement le code ci-dessous à votre EditText de votre fichier xml.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Et si vous souhaitez autoriser à la fois le texte en majuscules et les chiffres, utilisez le code ci-dessous.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"

2
Cela fonctionne à coup sûr, mais ce n'est pas une très bonne expérience utilisateur. Je viens de l'essayer et comme le clavier ne s'autocapitalise pas (sur N au moins), les caractères en minuscules sont simplement ignorés sans retour à l'utilisateur, ce qui donne l'impression que l'interface utilisateur est cassée.
MattMatt

entièrement d'accord avec @MattMatt. Si nous le faisons, l'utilisateur ne pourra pas taper de minuscules. L'utilisateur doit être en mesure de taper ce qu'il / elle veut et le reste doit automatiquement mettre les mots en majuscules
Mir Adnan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.