Mise en majuscule de la première lettre pour EditText


383

Je travaille sur une petite application de liste de tâches personnelle et jusqu'à présent, tout a très bien fonctionné. Il y a une petite bizarrerie que j'aimerais comprendre. Chaque fois que je vais ajouter un nouvel élément, j'ai une boîte de dialogue avec une vue EditText montrant à l'intérieur. Lorsque je sélectionne la vue EditText, le clavier apparaît pour saisir du texte, comme il se doit. Dans la plupart des applications, la valeur par défaut semble être que la touche Maj est maintenue pour la première lettre ... bien qu'elle ne le fasse pas à mon avis. Il doit y avoir un moyen simple de corriger, mais j'ai cherché la référence à plusieurs reprises et je ne la trouve pas. Je pense qu'il doit y avoir un attribut xml pour la référence chargée par l'adaptateur, mais je ne peux pas savoir ce que c'est.

Réponses:


805

Statiquement (c'est-à-dire dans votre fichier XML de mise en page): réglez android:inputType="textCapSentences"sur votre EditText.

Par programme: vous devez inclure InputType.TYPE_CLASS_TEXTdans InputTypele EditText, par exemple

EditText editor = new EditText(this); 
editor.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);

Peut être combiné avec du texte et ses variantes pour demander la mise en majuscule du premier caractère de chaque phrase.

- Google Docs


5
testEditText.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); ou android: inputType = "textCapSentences" ne fonctionnera que si le paramètre de capitalisation automatique du clavier de votre appareil est activé.
Lakshmanan

8
Pourquoi l'activation de cette fonction fait que mon android:lines="7"ne montre plus 7 lignes (il revient maintenant à 1 ligne par défaut)
James Wierzba

3
estEditText.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); ou android: inputType = "textCapSentences" ne fonctionnera que si le paramètre de capitalisation automatique du clavier de votre appareil est activé. Quelle est l'alternative pour cela, par programme?
Swift

@JamesWierzba Je ferai référence ici à la réponse Shivang comme réponse pour le support multi-lignes. Ajouter android: inputType = "textCapSentences | textMultiLine"
Lénine

76

Utilisez simplement android:inputType="textCapWords" dans votre élément EditText.

Par exemple:

<EditText
    android:id="@+id/txtName"
    android:layout_width="0dp"
    android:layout_height="40dp"
    android:layout_weight="0.7"
    android:inputType="textCapWords"
    android:textColorHint="#aaa"
    android:hint="Name Surname"
    android:textSize="12sp" />

Reportez-vous au lien suivant pour référence: http://developer.android.com/reference/android/widget/TextView.html#attr_android%3ainputType


Il est recommandé de marquer le code dans l'élément de code au lieu de le mettre en gras.
Ravi Bhatt du

13
Cette réponse n'aide pas vraiment la question d'OP. Cela mettra en majuscule le premier caractère de chaque mot , pas le premier caractère du texte d'entrée (qui est supposé comme une phrase). Bien que cela puisse probablement aider les autres, la bonne réponse est la réponse acceptée.
Andrew T.

37

Appliquez la ligne suivante dans votre EditText en XML.

android:inputType="textCapSentences|textMultiLine"

Il permettra également un support multi-lignes.


2
Cela devrait être une réponse acceptée, car c'est la seule solution qui ne réduira pas EditText en une seule ligne
egorikem

31
testEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);   

ou android:inputType="textCapSentences"ne fonctionnera que si le paramètre de capitalisation automatique du clavier de votre appareil est activé.


Merci, j'ai été bloqué parce que je viens de désactiver le paramètre de capitalisation automatique du clavier de l'appareil
Pulkit

20

J'ai rencontré le même problème, partageant juste ce que j'ai découvert. Pourrait vous aider, vous et les autres ...

Essayez ceci sur votre mise en page. Ajoutez la ligne ci-dessous dans votre EditText.

android:inputType="textCapWords|textCapSentences"

fonctionne bien sur moi .. j'espère que cela fonctionne aussi sur vous ...


5

Je peux vous assurer que les deux réponses seront en majuscule et ne feront pas d'edittext sur une seule ligne.

Si vous voulez le faire en XMl ci-dessous est le code

android:inputType="textCapWords|textCapSentences"

Si vous voulez le faire dans une activité / un fragment, etc. ci-dessous est le code

momentTextView.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS | InputType.TYPE_TEXT_FLAG_MULTI_LINE)

PS: Si vous avez d'autres propriétés, vous pouvez également les ajouter facilement avec un tuyau "|" symbole, assurez-vous simplement qu'il n'y a pas d'espace en xml entre les propriétés d'attribut


5

Pour la capitalisation dans EditText, vous pouvez choisir les deux types d'entrée ci-dessous:

  1. android: inputType = "textCapSentences"
  2. android: inputType = "textCapWords"

textCapSentences
Cela laissera la première lettre du premier mot comme Capital dans chaque phrase.

textCapWords Cela laissera la première lettre de chaque mot comme Capital.

Si vous voulez les deux attributs, utilisez simplement | signer avec les deux attributs

android:inputType="textCapSentences|textCapWords"

3

Essayez ce code, il mettra en majuscule le premier caractère de tous les mots.

- définir addTextChangedListener pour la vue EditText

edt_text.addTextChangedListener (observateur);

- Ajouter TextWatcher

TextWatcher watcher = new TextWatcher() {
    int mStart = 0;

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        mStart = start + count;
    }

    @Override
    public void afterTextChanged(Editable s) {
        String input = s.toString();
        String capitalizedText;
        if (input.length() < 1)
            capitalizedText = input;
        else if (input.length() > 1 && input.contains(" ")) {
            String fstr = input.substring(0, input.lastIndexOf(" ") + 1);
            if (fstr.length() == input.length()) {
                capitalizedText = fstr;
            } else {
                String sstr = input.substring(input.lastIndexOf(" ") + 1);
                sstr = sstr.substring(0, 1).toUpperCase() + sstr.substring(1);
                capitalizedText = fstr + sstr;
            }
        } else
            capitalizedText = input.substring(0, 1).toUpperCase() + input.substring(1);

        if (!capitalizedText.equals(edt_text.getText().toString())) {
            edt_text.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    edt_text.setSelection(mStart);
                    edt_text.removeTextChangedListener(this);
                }
            });
            edt_text.setText(capitalizedText);
        }
    }
};

3

Pour mettre en majuscule, vous pouvez effectuer les opérations suivantes avec le texte d'édition:

Pour mettre en majuscule la première lettre de chaque mot :

android:inputType="textCapWords"

Pour mettre en majuscule la première lettre de chaque phrase :

android:inputType="textCapSentences"

Pour rendre chaque lettre majuscule:

android:inputType="textCapCharacters"

Mais cela n'apportera que des modifications au clavier et l'utilisateur peut changer le mode d'écriture des lettres dans de petits cas.

Donc, cette approche n'est pas très appréciée si vous voulez vraiment les données au format majuscule, ajoutez d'abord la classe suivante:

public class CapitalizeFirstLetter {
    public static String capitaliseName(String name) {
        String collect[] = name.split(" ");
        String returnName = "";
        for (int i = 0; i < collect.length; i++) {
            collect[i] = collect[i].trim().toLowerCase();
            if (collect[i].isEmpty() == false) {
                returnName = returnName + collect[i].substring(0, 1).toUpperCase() + collect[i].substring(1) + " ";
            }
        }
        return returnName.trim();
    }
    public static String capitaliseOnlyFirstLetter(String data)
    {
        return data.substring(0,1).toUpperCase()+data.substring(1);
    }
}

Et alors,

Maintenant pour capitaliser chaque mot:

CapitalizeFirstLetter.capitaliseName(name);

Pour mettre en majuscule uniquement le premier mot:

CapitalizeFirstLetter.capitaliseOnlyFirstLetter(data);

2

Définissez le type d'entrée en XML ainsi qu'en fichier JAVA comme celui-ci,

En XML,

android: inputType = "textMultiLine | textCapSentences"

Il permettra également le multiligne et le fichier JAVA,

edittext.setRawInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);

assurez-vous que le paramètre de capitalisation automatique de votre clavier est activé .


2

Dans votre fichier XML de mise en page:

  • ensemble android:inputType="textCapSentences"

  • Sur votre EditTextavoir le premier alphabet du premier mot de chaque phrase comme majuscule

  • Ou android:inputType="textCapWords"sur votre EditText pour avoir le premier alphabet de chaque mot comme majuscule


1

utiliser ce code uniquement pour la mise en majuscule de la première lettre pour EditText

MainActivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:tag="true">
    </EditText>

</RelativeLayout>

MainActivity.java

EditText et = findViewById(R.id.et);
        et.addTextChangedListener(new TextWatcher() {
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
            {
                if (et.getText().toString().length() == 1 && et.getTag().toString().equals("true"))
                {
                    et.setTag("false");
                    et.setText(et.getText().toString().toUpperCase());
                    et.setSelection(et.getText().toString().length());
                }
                if(et.getText().toString().length() == 0)
                {
                    et.setTag("true");
                }
            }

            public void afterTextChanged(Editable editable) {

            }
        });

0

Auparavant, c'était le cas android:capitalize="words", désormais obsolète. L'alternative recommandée est d'utiliserandroid:inputType="textCapWords"

Veuillez noter que cela ne fonctionnera que si le paramètre de capitalisation automatique du clavier de votre appareil est activé.

Pour ce faire par programme, utilisez la méthode suivante:

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);


0

j'ai fondé et ma solution: vous avez 2 façons de le résoudre en java:

 testEditText.setInputType(InputType.TYPE_CLASS_TEXT 
 | InputType.TYPE_TEXT_FLAG_CAP_WORDS);   

et xml:

 <EditText
android:id="@+id/mytxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapWords"
android:textSize="12sp" />

0

Par programme

TextView firstline = (TextView) findViewById(R.id.firstline);
firstline.setAllCaps(true);

0

si vous écrivez des styles dans styles.xml,

supprimer la propriété android: inputType et ajouter les lignes ci-dessous

<item name="android:capitalize">words</item>
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.