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?

Natacha
la source

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);
ErlVolton
la source
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.)

Aoyama Nanami
la source
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.

Gabe Sechan
la source
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
      }
    }
});  
Harshid
la source
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.

Abhishek
la source
@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.

Pabel
la source
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.

Anthonycr
la source
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é!

S Pimenta
la source
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.

vishnu benny
la source
8

Utiliser le filtre d'entrée

editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
Sreejesh K Nair
la source
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());
    }
});  
Anderson Carvalho
la source
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"
Pravin Suthar
la source
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
Nivedh
la source
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"
                    />
Udara Abeythilake
la source
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"
/>
akshay shetty
la source
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()});
Agil Anbu
la source
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)
}
Roc Boronat
la source
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"
    />
Ashana.Jackol
la source
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() });

Tony
la source
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());
stovroz
la source
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

Vlad
la source
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.

boriguen
la source
-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"
Khusboo
la source
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