Letras maiúsculas na primeira letra do EditText

383

Estou trabalhando em um aplicativo pessoal de lista de tarefas e, até agora, tudo está funcionando muito bem. Há uma pequena peculiaridade que eu gostaria de descobrir. Sempre que vou adicionar um novo item, tenho uma caixa de diálogo com uma visualização EditText exibida. Quando seleciono a visualização EditText, o teclado aparece para inserir texto, como deveria. Na maioria dos aplicativos, o padrão parece ser que a tecla Shift é mantida para a primeira letra ... embora não faça isso na minha opinião. Tem que haver uma maneira simples de corrigir, mas pesquisei a referência repetidamente e não consigo encontrá-la. Estou pensando que deve haver um atributo xml para a referência carregada pelo adaptador, mas não consigo descobrir o que é.

Maximus
fonte

Respostas:

805

Estaticamente (ou seja, no seu arquivo XML de layout): defina android:inputType="textCapSentences"no seu EditText.

Programaticamente: você tem que incluir InputType.TYPE_CLASS_TEXTna InputTypedo EditText, por exemplo,

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

Pode ser combinado com o texto e suas variações para solicitar letras maiúsculas no primeiro caractere de cada frase.

- Documentos Google

McStretch
fonte
5
testEditText.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); ou android: inputType = "textCapSentences" funcionará apenas se a configuração de capitalização automática do teclado do dispositivo estiver ativada.
precisa
8
Por que permitir que esta causa a minha android:lines="7"para não mostrar 7 linhas (agora padrão para 1 linha)
James Wierzba
3
estEditText.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); ou android: inputType = "textCapSentences" funcionará apenas se a configuração de capitalização automática do teclado do dispositivo estiver ativada. Qual é a alternativa para isso, programaticamente?
Swift
@ JamesWierzba Vou me referir aqui à resposta Shivang como resposta para o suporte de várias linhas. Adicionar android: inputType = "textCapSentences | textMultiLine"
Lenin
76

Apenas use android:inputType="textCapWords" no seu elemento EditText.

Por exemplo:

<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" />

Consulte o seguinte link para referência: http://developer.android.com/reference/android/widget/TextView.html#attr_android%3ainputType

Mangi Morobe
fonte
É uma boa prática marcar o código no elemento code e torná-lo em negrito.
Ravi Bhatt
13
Essa resposta realmente não ajuda a pergunta do OP. Isso colocará em maiúscula o primeiro caractere para cada palavra , não o primeiro caractere do texto de entrada (que é assumido como uma sentença). Embora isso possa provavelmente ajudar os outros, a resposta correta é a resposta aceita.
Andrew T.
37

Aplique a seguinte linha no seu EditText em XML.

android:inputType="textCapSentences|textMultiLine"

Também permitirá suporte a várias linhas.

Shivang
fonte
2
Isso deve ser uma resposta aceita, pois esta é a única solução que não entrará em colapso EditText em linha única
egorikem
31
testEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);   

ou android:inputType="textCapSentences"só funcionará se a configuração de capitalização automática do teclado do dispositivo estiver ativada.

Lakshmanan
fonte
Obrigado, fiquei preso porque acabei de desativar o teclado do dispositivo Configuração de capitalização automática
Pulkit
20

Encontrei o mesmo problema, apenas compartilhando o que descobri. Pode ajudar você e outras pessoas ...

Tente isso no seu layout. Adicione a linha abaixo no seu EditText.

android:inputType="textCapWords|textCapSentences"

funciona bem em mim .. espero que funcione também em você ...

user4144348
fonte
5

Posso garantir que as duas respostas farão maiúsculas na primeira letra e não no edittext em uma única linha.

Se você quiser fazer isso em XMl abaixo está o código

android:inputType="textCapWords|textCapSentences"

Se quiser fazê-lo em atividade / fragmento etc abaixo está o código

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

PS: Se você estiver tendo outras propriedades, também poderá adicioná-las facilmente com um pipe "|" símbolo, verifique se não há espaço no xml entre as propriedades do atributo

Tushar Srivastava
fonte
5

Para Capitalização no EditText, você pode escolher os dois tipos de entrada abaixo:

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

textCapSentences
Isso permitirá que a primeira letra da primeira palavra seja maiúscula em cada frase.

textCapWords Isso permitirá que a primeira letra de cada palavra seja maiúscula.

Se você deseja os dois atributos, basta usar | assine com os dois atributos

android:inputType="textCapSentences|textCapWords"
anand tripathi
fonte
3

Experimente este código, ele colocará em maiúscula o primeiro caractere de todas as palavras.

- definir addTextChangedListener para a visualização EditText

edt_text.addTextChangedListener (observador);

- Adicionar 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);
        }
    }
};
Dharmesh Patel
fonte
3

Para capitalizar, você pode fazer o seguinte com editar texto:

Para tornar a primeira letra maiúscula de cada palavra :

android:inputType="textCapWords"

Para colocar a primeira letra em maiúscula em cada frase :

android:inputType="textCapSentences"

Para colocar todas as letras em maiúsculas:

android:inputType="textCapCharacters"

Mas isso fará apenas alterações no teclado e o usuário poderá alterar o modo para escrever uma letra minúscula.

Portanto, essa abordagem não é muito apreciada se você realmente deseja que os dados estejam no formato de letras maiúsculas, adicione a seguinte classe primeiro:

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);
    }
}

E depois,

Agora, para capitalizar cada palavra:

CapitalizeFirstLetter.capitaliseName(name);

Para colocar em maiúscula apenas a primeira palavra:

CapitalizeFirstLetter.capitaliseOnlyFirstLetter(data);
Suraj Vaishnav
fonte
2

Defina o tipo de entrada no XML e no arquivo JAVA como este,

Em XML,

android: inputType = "textMultiLine | textCapSentences"

Também permitirá multilinhas e no arquivo JAVA,

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

verifique se a configuração de capitalização automática do teclado está ativada .

Siddharth Sheth
fonte
2

No seu arquivo XML de layout:

  • conjunto android:inputType="textCapSentences"

  • Para que você EditTexttenha o primeiro alfabeto da primeira palavra de cada frase como maiúscula

  • Ou android:inputType="textCapWords"no seu EditText para ter o primeiro alfabeto de cada palavra como maiúscula

Himmat Gill
fonte
1

use esse código apenas para maiúsculas na primeira letra do 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) {

            }
        });
milão pithadia
fonte
0

Anteriormente android:capitalize="words", o que agora está obsoleto. A alternativa recomendada é usarandroid:inputType="textCapWords"

Observe que isso só funcionará se a configuração de capitalização automática do teclado do dispositivo estiver ativada.

Para fazer isso programaticamente, use o seguinte método:

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);

Mahendra Liya
fonte
0

eu fundei e minha solução: você tem 2 maneiras de resolvê-lo em java:

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

e xml:

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

fonte
0

Programaticamente

TextView firstline = (TextView) findViewById(R.id.firstline);
firstline.setAllCaps(true);
Rajesh Tiwari
fonte
0

se você estiver escrevendo estilos em styles.xml,

remova a propriedade android: inputType e adicione as linhas abaixo

<item name="android:capitalize">words</item>
Sai Gopi N
fonte