En Android EditText, ¿cómo forzar la escritura en mayúsculas?

144

En mi aplicación de Android tengo diferentes EditTextdonde el usuario puede ingresar información. Pero necesito forzar al usuario a escribir en mayúsculas. ¿Conoces una función para hacer eso?

Natacha
fuente

Respuestas:

340

¡Android en realidad tiene un InputFilter incorporado solo para esto !

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

Tenga cuidado, setFilters se restablecerán todos los demás atributos que se establecieron a través de XML (es decir maxLines, inputType, imeOptinos...). Para evitar esto, agregue Filtros a los ya 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
fuente
3
¡Si! ¡Esta es la mejor respuesta! Sin edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});embargo, el código debería ser .
Arthur
44
OK, amigos, tenían razón, actualicé mi respuesta. ¡Gracias por ayudar a mejorar esto!
ErlVolton
44
Para evitar anulando los filtros que defina en XML (por ej. maxLength), Intenta anexar el InputFilter.AllCaps()de editText.getFiltersmatriz. Ver stackoverflow.com/a/18934659/3890983
tropicales el
21
O simplemente en KotlineditText.filters = editText.filters + InputFilter.AllCaps()
Ilia Kurtov
44
Mejor aún: ¡ editText.filters += InputFilter.AllCaps()Kotlin es maravilloso! <3
Milack27
123

Si desea obligar al usuario a escribir en mayúsculas de forma predeterminada en su EditText, solo necesita agregar android:inputType="textCapCharacters". (El usuario aún puede cambiar manualmente a minúsculas).

Aoyama Nanami
fuente
39
nada impide que el usuario presione 'shift' y escriba una letra en minúscula.
Fernando Leal
De acuerdo con Fernando, si bien el teclado está predeterminado en mayúsculas, no los requiere.
pforhan
El usuario puede usar el botón de mayúsculas para ingresar una letra minúscula como dice @Fernando
Ajinkya
24

Establecer el input typea TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS. El keyboarddebería honrar eso.

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

Se puede usar de dos maneras.

Primera forma:

Establecer android:inputType="textCapSentences"en su EditText.

Segunda forma:

Cuando el usuario ingrese el número, debe usar el observador de texto y cambiarlo por minúscula a mayú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
      }
    }
});  
Dura
fuente
2
su solución no funciona porque establece la cadena en un orden inverso.
co2f2e
de qué manera usaste primero o segundo.
Harshid
El primero no está funcionando en absoluto. El segundo hace que el texto esté en mayúscula, pero debemos establecer programáticamente el cursor al final de la oración.
co2f2e
@Kalanamith ya continuación, lo que es un problema
Harshid
66
Para la primera opción textCapSentences capitaliza las oraciones, necesita textCapCharacters.
Ghoti
13

Puede agregar la android:textAllCaps="true"propiedad a su archivo xml en EditText. Esto hará que el teclado de entrada de software aparezca en modo mayúsculas. El valor que ingrese aparecerá en mayúsculas. Sin embargo, esto no asegurará que el usuario solo pueda ingresar UpperCaseletras. Si lo desean, aún pueden recurrir a las letras minúsculas. Si desea asegurarse de que la salida del archivo Edittextesté en mayúsculas, debe convertir manualmente la cadena de entrada utilizando el toUpperCase()método de Stringclase.

Abhishek
fuente
@GustavoAlves, ¿Puedes decirme qué pasó cuando intentaste esto? Puede ser que pueda investigar tu problema. :)
Abhishek
Hola @Abhishek Establecer la propiedad no cambió nada. EditText todavía acepta caracteres en mayúsculas y minúsculas.
Gus Costa
1
Sí, si desea restringir su EditText solo para aceptar caracteres en mayúscula, android: inputType = "textCapCharacters" sería la opción correcta. Pruébalo y luego házmelo saber. ☺️
Abhishek
1
Esto causó una excepción de índice fuera de límites cuando escribí.
Zapnologica
2
android:textAllCaps="true"es solo una propiedad de TextView ( stackoverflow.com/a/28803492/5268730 ). Usar en su android:inputType="textCapCharacters"lugar.
woodii
11

Deberías poner android:inputType="textCapCharacters"con Edittext en el archivo xml.

Pabel
fuente
9
AoyamaNanami escribió exactamente la misma respuesta. Por favor, concéntrese en las preguntas más actuales, esta es de 2013. :)
ByteHamster
2
Tenga en cuenta que el usuario puede cambiar e ingresar caracteres más bajos
Rafa0809
10

En lugar de preocuparse por tratar con el teclado, ¿por qué no simplemente aceptar cualquier entrada, minúscula o mayúscula y convertir la cadena a mayúscula?

El siguiente código debería ayudar:

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

Esto es fácil de usar ya que no es necesario que el usuario sepa que necesita la cadena en mayúsculas. Espero que esto ayude.

anthonycr
fuente
9

Aún mejor ... un trazador de líneas en Kotlin ...

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

¡Hecho!

S Pimenta
fuente
2
Puede escribirlo utilizando la sintaxis de acceso a la propiedad: <your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
Makotosan
8
Mejor aún:<your_edit_text>.filters += InputFilter.AllCaps()
Makotosan
9

En kotlin , en el archivo .kt, realice los cambios:

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

Utilice la propiedad sintética para el acceso directo del widget con id. Y en XML, para su texto de edición agregue un par de marcas más 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"
    />

Esto actualizará el teclado como mayúsculas habilitadas.

vishnu benny
fuente
8

Usar filtro de entrada

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

Solo haz esto:

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

Intente usar cualquiera de los siguientes códigos para resolver su problema.

programáticamente:

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

XML:

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

Para mí funcionó agregando android: textAllCaps = "true" y 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
fuente
3

Para obtener todo el capital, use lo siguiente en su XML:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
/>
akshay shetty
fuente
2
¿Has probado esta solución? esto da como resultado el bloqueo de la aplicación cuando el usuario comienza a editar el contenido de editext
surhidamatya
3

pruebe este código, hará su entrada en mayúsculas

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

Según la respuesta aceptada, esta respuesta hace lo mismo, pero en Kotlin. Solo para facilitar el copypasting: ·)

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

Para obtener el teclado en mayúscula cuando haga clic en editar texto, use este código en su 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
fuente
1

Estoy usando Visual Studio 2015 / Xamarin para construir mi aplicación para Android 5.1 y Android 6.0 (la misma apk instalada en ambos).

Cuando especifiqué android:inputType="textCapCharacters"en mi axml, el teclado AllCaps apareció como se esperaba en Android 6.0, pero no en Android 5.1. He añadido android:textAllCaps="true"a mi axml y todavía sin teclado MAYÚSCULAS en Android 5.1. Configuré un filtro usandoEditText.SetFilters(new IInputFilter[] { new InputFilterAllCaps() }); y aunque el teclado virtual muestra caracteres en minúsculas en Android 5.1, el campo de entrada ahora es AllCaps.

EDITAR: Las diferencias de comportamiento que observé y supuse que estaban relacionadas con el sistema operativo se debieron en realidad a que tenía diferentes versiones de Google Keyboard en los dispositivos de prueba. Una vez que actualicé los dispositivos al último Teclado de Google (lanzado en julio de 2016 a partir de este escrito), el comportamiento de 'Mayúsculas' fue consistente en todos los sistemas operativos. Ahora, todos los dispositivos muestran caracteres en minúscula en el teclado, pero la entrada es Mayúsculas debido aSetFilters(new IInputFilter[] { new InputFilterAllCaps() });

Tony
fuente
1
Hola Tony, parece que has creado 2 cuentas; stackoverflow.com/users/6764633/tony-celia y stackoverflow.com/users/6771440/deeveedee . Si desea fusionarlos, consulte stackoverflow.com/help/merging-accounts .
Matt
Gracias Matt. Marque esto con el aprendizaje principiante / errores. No recordaba que había creado otra cuenta hasta que lo señaló. Afortunadamente, la función de combinación de cuentas era simple. Gran foro!
Tony
1

Xamarin equivalente de la respuesta de ErlVolton:

editText.SetFilters(editText.GetFilters().Append(new InputFilterAllCaps()).ToArray());
Stovroz
fuente
Es por eso que me encanta cómo C # puede ser tan conciso.
Lionet Chen
1

Realización simple de kotlin

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

PS para mí filterssiempre está vacío inicialmente

Vlad
fuente
0

Un Java 1-liner de la solución propuesta podría ser:

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

Tenga en cuenta que necesita com.google.common.collect.Lists.

boriguen
fuente
-1

Simplemente, agregue el siguiente código a su EditText de su archivo xml.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Y si desea permitir tanto el texto en mayúscula como los dígitos, use el siguiente código.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
Khusboo
fuente
2
Eso funciona con seguridad, pero no es una experiencia de usuario muy agradable. Acabo de probarlo y como el teclado no se autocapitaliza (al menos en N), los caracteres escritos en minúscula simplemente se ignoran sin comentarios para el usuario, lo que hace que la IU parezca rota.
MattMatt
completamente de acuerdo con @MattMatt. Si lo hacemos, el usuario no podrá escribir minúsculas. El usuario debe poder escribir cualquier caso que quiera y el resto debe auto mayúsculas las palabras
Mir Adnan