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?

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

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).


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.


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

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.


@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.


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.


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!


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.


8

Usar filtro de entrada

editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

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

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"

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

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

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

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

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

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

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


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

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


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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.