Primera letra mayúscula para EditText

383

Estoy trabajando en una pequeña aplicación de lista de tareas personal y hasta ahora todo ha funcionado bastante bien. Hay una pequeña peculiaridad que me gustaría resolver. Cada vez que voy a agregar un nuevo elemento, tengo un cuadro de diálogo con una vista EditText que se muestra dentro. Cuando selecciono la vista EditText, el teclado aparece para ingresar texto, como debería. En la mayoría de las aplicaciones, el valor predeterminado parece ser que la tecla Mayús se mantiene para la primera letra ... aunque, en mi opinión, no lo hace. Tiene que haber una manera simple de arreglarlo, pero he buscado la referencia repetidamente y no puedo encontrarla. Estoy pensando que tiene que haber un atributo xml para la referencia cargada por el Adaptador, pero no puedo averiguar qué es.

Maximus
fuente

Respuestas:

805

Estáticamente (es decir, en su archivo XML de diseño): establezca android:inputType="textCapSentences"en suEditText .

Programáticamente: debe incluir InputType.TYPE_CLASS_TEXTen el InputTypede EditText, por ejemplo

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

Se puede combinar con texto y sus variaciones para solicitar la capitalización del primer carácter de cada oración.

- Documentos de Google

McStretch
fuente
55
testEditText.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); o android: inputType = "textCapSentences" solo funcionará si la configuración de capitalización automática del teclado de su dispositivo está habilitada.
Lakshmanan
8
¿Por qué habilitar esto hace android:lines="7"que ya no muestre 7 líneas (ahora vuelve a 1 línea por defecto)
James Wierzba
3
estEditText.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); o android: inputType = "textCapSentences" solo funcionará si la configuración de capitalización automática del teclado de su dispositivo está habilitada. ¿Cuál es la alternativa para esto, programáticamente?
Swift
@JamesWierzba Me referiré aquí a la respuesta de Shivang como respuesta para el soporte de varias líneas. Añadir android: inputType = "textCapSentences | textMultiLine"
Lenin
76

Simplemente utilícelo android:inputType="textCapWords"en su elemento EditText.

Por ejemplo:

<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 el siguiente enlace para referencia: http://developer.android.com/reference/android/widget/TextView.html#attr_android%3ainputType

Mangi Morobe
fuente
Es una buena práctica marcar el código en el elemento de código en lugar de hacerlo en negrita.
Ravi Bhatt
13
Esta respuesta realmente no ayuda a la pregunta de OP. Esto capitalizará el primer carácter para cada palabra , no el primer carácter del texto de entrada (que se supone como una oración). Si bien esto probablemente ayude a los demás, la respuesta correcta es la respuesta aceptada.
Andrew T.
37

Aplique la siguiente línea en su EditText en XML.

android:inputType="textCapSentences|textMultiLine"

También permitirá el soporte multilínea.

Shivang
fuente
2
Esa debería ser una respuesta aceptada, ya que esta es la única solución que no colapsará EditText en una sola línea
egorikem el
31
testEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);   

o android:inputType="textCapSentences"solo funcionará si la configuración de capitalización automática del teclado de su dispositivo está habilitada.

Lakshmanan
fuente
Gracias, me quedé atrapado porque acabo de deshabilitar la configuración de capitalización automática del teclado del dispositivo
Pulkit
20

Encontré el mismo problema, solo compartí lo que descubrí. Podría ayudarte a ti y a otros ...

Pruebe esto en su diseño. Agregue la línea siguiente en su EditText.

android:inputType="textCapWords|textCapSentences"

funciona bien en mí ... espero que funcione también en ti ...

usuario4144348
fuente
5

Les puedo asegurar que ambas respuestas harán mayúscula en la primera letra y no harán que edittext sea una sola línea.

Si quieres hacerlo en XMl debajo está el código

android:inputType="textCapWords|textCapSentences"

Si desea hacerlo en actividad / fragmento, etc. a continuación se encuentra el código

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

PD: Si no tiene otra propiedad, también puede agregarla fácilmente con una tubería "|" símbolo, solo asegúrese de que no haya espacio en xml entre las propiedades del atributo

Tushar Srivastava
fuente
5

Para Capitalización en EditText, puede elegir los dos tipos de entrada siguientes:

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

textCapSentences
Esto permitirá que la primera letra de la primera palabra sea Capital en cada oración.

textCapWords Esto dejará la primera letra de cada palabra como Capital.

Si desea ambos atributos, simplemente use | firmar con ambos atributos

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

Pruebe este código, capitalizará el primer carácter de todas las palabras.

- establecer addTextChangedListener para la vista EditText

edt_text.addTextChangedListener (observador);

- Agregar 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
fuente
3

Para capitalizar, puede hacer lo siguiente con editar texto:

Para poner en mayúscula la primera letra de cada palabra :

android:inputType="textCapWords"

Para poner en mayúscula la primera letra de cada oración :

android:inputType="textCapSentences"

Para hacer cada letra mayúscula:

android:inputType="textCapCharacters"

Pero esto solo hará cambios en el teclado y el usuario puede cambiar el modo para escribir letras en minúsculas.

Por lo tanto, este enfoque no es muy apreciado si realmente desea los datos en formato de mayúsculas, agregue la siguiente clase primero:

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

Y entonces,

Ahora para capitalizar cada palabra:

CapitalizeFirstLetter.capitaliseName(name);

Para capitalizar solo la primera palabra:

CapitalizeFirstLetter.capitaliseOnlyFirstLetter(data);
Suraj Vaishnav
fuente
2

Establezca el tipo de entrada en XML, así como en un archivo JAVA como este,

En XML,

android: inputType = "textMultiLine | textCapSentences"

También permitirá líneas múltiples y en archivos JAVA,

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

asegúrese de que la configuración de Capitalización automática de su teclado esté Activada .

Siddharth Sheth
fuente
2

En su archivo XML de diseño:

  • conjunto android:inputType="textCapSentences"

  • En su EditTextprimer alfabeto de la primera palabra de cada oración como mayúscula

  • O android:inputType="textCapWords"en su EditText para tener el primer alfabeto de cada palabra como mayúscula

Himmat Gill
fuente
1

use este código solo con mayúscula de primera letra para 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án Pithadia
fuente
0

Anteriormente solía ser android:capitalize="words", que ahora está en desuso. La alternativa recomendada es usarandroid:inputType="textCapWords"

Tenga en cuenta que esto solo funcionará si la configuración de capitalización automática del teclado de su dispositivo está habilitada.

Para hacer esto programáticamente, use el siguiente método:

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS);

Mahendra Liya
fuente
0

fundé y mi solución: tienes 2 formas de resolverlo en Java:

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

y xml:

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

fuente
0

Programáticamente

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

si está escribiendo estilos en styles.xml entonces

eliminar la propiedad android: inputType y agregar líneas debajo

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