No Android EditText, como forçar a escrita em maiúsculas?

144

No meu aplicativo Android, tenho diferentes EditTextonde o usuário pode inserir informações. Mas preciso forçar o usuário a escrever em letras maiúsculas. Você conhece uma função para fazer isso?

Natacha
fonte

Respostas:

340

O Android, na verdade, possui um InputFilter interno apenas para isso !

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

Tenha cuidado, setFilters irá repor todos os outros atributos que foram definidos via XML (ou seja maxLines, inputType, imeOptinos...). Para evitar isso, adicione filtro (s) aos já existentes.

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
fonte
3
Sim! Esta é a melhor resposta! O código deve ser edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});embora.
Arthur
4
OK, vocês estavam certos, eu atualizei minha resposta. Obrigado por ajudar a melhorar isso !!
ErlVolton
4
Para evitar substituir os filtros definidos no xml (por exemplo maxLength), tente anexar a matriz InputFilter.AllCaps()to editText.getFilters. Veja stackoverflow.com/a/18934659/3890983
tropicalfish
21
Ou em Kotlin apenaseditText.filters = editText.filters + InputFilter.AllCaps()
Ilia Kurtov
4
Melhor ainda: editText.filters += InputFilter.AllCaps()Kotlin é maravilhoso! <3
Milack27
123

Se você deseja forçar o usuário a escrever em letras maiúsculas por padrão no seu EditText, basta adicionar android:inputType="textCapCharacters". (O usuário ainda pode alterar manualmente para minúsculas.)

Aoyama Nanami
fonte
39
nada impede que o usuário pressione 'shift' e escreva uma letra minúscula.
Fernando Leal
Concorde com Fernando, embora ele defina o teclado como caps, ele não precisa deles.
pforhan
O usuário pode usar o botão SHIFT para entrar pequena caixa carta como disse @Fernando
Ajinkya
24

Defina input typecomo TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS. O keyboarddeve honrar isso.

Gabe Sechan
fonte
android: inputType = "textCapCharacters"
Parth Kapoor
18

Você pode usar em dois sentidos.

Primeira maneira:

Defina android:inputType="textCapSentences"no seu EditText.

Segunda maneira:

Quando o usuário digita o número, você deve usar o observador de texto e alterar pequeno para letra maiúscula.

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
fonte
2
sua solução não funciona porque define a sequência em uma ordem inversa.
co2f2e
para que lado você usou primeiro ou segundo.
Harshid
O primeiro não está funcionando. O segundo coloca o texto em maiúsculas, mas devemos definir programaticamente o cursor no final da frase.
co2f2e
@Kalanamith ya então o que é problema
Harshid
6
Para a primeira opção textCapSentences em maiúsculas, você precisa de textCapCharacters.
Ghoti
13

Você pode adicionar a android:textAllCaps="true"propriedade ao seu arquivo xml no EditText. Isso fará com que o teclado de entrada suave apareça no modo todas maiúsculas. O valor digitado aparecerá em maiúsculas. No entanto, isso não garante que o usuário possa digitar apenas UpperCaseletras. Se eles quiserem, ainda podem voltar para as letras minúsculas. Se você deseja garantir que a saída de Edittextesteja em Todos os caps, é necessário converter manualmente a String de entrada usando o toUpperCase()método da Stringclasse

Abhishek
fonte
@GustavoAlves, você pode me dizer o que aconteceu quando tentou isso? Pode ser que eu possa analisar seu problema. :)
Abhishek
Oi @Abhishek. Definir a propriedade não mudou nada. O EditText ainda aceita caracteres maiúsculos e minúsculos.
Gus Costa
1
Sim, se você deseja restringir seu EditText apenas para aceitar caracteres em maiúsculas, android: inputType = "textCapCharacters" seria a opção certa. Experimente e me avise. Ab️
Abhishek
1
Isso causou e exceção de índice fora dos limites quando todo que eu digitei.
Zapnologica
2
android:textAllCaps="true"é apenas uma propriedade do TextView ( stackoverflow.com/a/28803492/5268730 ). Use em android:inputType="textCapCharacters"vez disso.
woodii
11

Você deve colocar android:inputType="textCapCharacters"com Edittext no arquivo xml.

Pabel
fonte
9
AoyamaNanami escreveu exatamente a mesma resposta. Por favor, se concentrar em questões mais atuais, esta é a partir de 2013. :)
ByteHamster
2
Aviso que o usuário pode Shift e inserir caracteres mais baixos
Rafa0809
10

Em vez de se preocupar em lidar com o teclado, por que não aceitar qualquer entrada, minúscula ou maiúscula e converter a string em maiúscula?

O código a seguir deve ajudar:

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

Isso é fácil de usar, pois não é necessário que o usuário saiba que você precisa da sequência em maiúsculas. Espero que isto ajude.

anthonycr
fonte
9

Melhor ainda ... um forro em Kotlin ...

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

Feito!

S Pimenta
fonte
2
Você pode escrevê-lo usando a sintaxe de acesso à propriedade: <your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
Makotosan
8
Melhor ainda:<your_edit_text>.filters += InputFilter.AllCaps()
Makotosan
9

No kotlin , no arquivo .kt, faça as alterações:

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

Use propriedade sintética para acesso direto ao widget com o ID. E em XML, para o seu texto de edição, adicione mais alguns sinalizadores como:

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

Isso atualizará o teclado como maiúscula ativado.

vishnu benny
fonte
8

Use filtro de entrada

editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
Sreejesh K Nair
fonte
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
fonte
6

Apenas faça o seguinte:

// ****** 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
fonte
5

Tente usar qualquer um dos códigos abaixo para resolver seu problema.

programaticamente:

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

XML:

android:inputType="textCapCharacters" with Edittext
Nivedh
fonte
4

Para mim, funcionou adicionando android: textAllCaps = "true" e 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
fonte
3

Para obter todo o capital, use o seguinte em seu XML:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
/>
akshay shetty
fonte
2
você já tentou esta solução? isso resulta em falha do aplicativo quando o usuário começa a editar o conteúdo do editext
surhidamatya
3

tente este código que fará sua entrada em maiúsculas

edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});
Agil anbu
fonte
2

Com base na resposta aceita, essa resposta faz o mesmo, mas em Kotlin. Apenas para facilitar o copypasting: ·)

private fun EditText.autocapitalize() {
    val allCapsFilter = InputFilter.AllCaps()
    setFilters(getFilters() + allCapsFilter)
}
Roc Boronat
fonte
1
filters += InputFilter.AllCaps(): D
crgarridos
1

Para obter um teclado com letras maiúsculas ao clicar em edittext, use este código no seu 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
fonte
1

Estou usando o Visual Studio 2015 / Xamarin para criar meu aplicativo para Android 5.1 e Android 6.0 (mesmo apk instalado em ambos).

Quando especifiquei android:inputType="textCapCharacters"no meu axml, o teclado AllCaps apareceu como esperado no Android 6.0, mas não no Android 5.1. Eu adicionei android:textAllCaps="true"à minha axml e ainda sem teclado Allcaps no Android 5.1. EditText.SetFilters(new IInputFilter[] { new InputFilterAllCaps() });Defino um filtro usando e enquanto o teclado virtual mostra caracteres minúsculos no Android 5.1, o campo de entrada agora é AllCaps.

EDIT: As diferenças comportamentais que observei e presumi serem relacionadas ao sistema operacional eram, na verdade, porque eu tinha versões diferentes do teclado do Google nos dispositivos de teste. Depois que atualizei os dispositivos para o teclado do Google mais recente (lançado em julho de 2016), o comportamento de 'All Caps' era consistente em todos os sistemas operacionais. Agora, todos os dispositivos mostram caracteres minúsculos no teclado, mas a entrada é All Caps por causa deSetFilters(new IInputFilter[] { new InputFilterAllCaps() });

Tony
fonte
1
Oi Tony, parece que você criou duas contas; stackoverflow.com/users/6764633/tony-celia e stackoverflow.com/users/6771440/deeveedee . Se você deseja mesclá-los, consulte stackoverflow.com/help/merging-accounts .
Matt
Obrigado Matt. Giz este até aprendizagem iniciante / erros. Não lembrava que eu havia criado outra conta até que você a apontou. felizmente, a função de mesclagem de contas era simples. Ótimo fórum!
677 Tony
1

Xamarin equivalente da resposta de ErlVolton:

editText.SetFilters(editText.GetFilters().Append(new InputFilterAllCaps()).ToArray());
stovroz
fonte
É por isso que eu amo como o C # pode ser tão conciso.
Lionet Chen
1

Realização simples do kotlin

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

PS para mim filtersestá sempre vazio inicialmente

Vlad
fonte
0

Um liner Java 1 da solução proposta pode ser:

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

Note que precisa com.google.common.collect.Lists.

boriguen
fonte
-1

Simplesmente, adicione o código abaixo ao seu EditText do seu arquivo xml.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

E se você deseja permitir texto e dígitos em maiúsculas, use o código abaixo.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
Khusboo
fonte
2
Isso funciona com certeza, mas não é uma experiência muito agradável para o usuário. Eu apenas tentei e, como o teclado não se autocapitaliza (pelo menos em N), os caracteres digitados em minúsculas são ignorados sem feedback do usuário, fazendo com que a interface do usuário pareça quebrada.
precisa saber é o seguinte
concordo completamente com @MattMatt. Se o fizermos, o usuário não poderá digitar letras minúsculas. O usuário deve ser capaz de escrever o que quer que caso ele / ela quer eo resto deve auto maiúsculas as palavras
Mir Adnan