Buscar..


Trabajando con EditTexts

El EditText es el widget de entrada de texto estándar en aplicaciones de Android. Si el usuario necesita ingresar texto en una aplicación, esta es la forma principal de hacerlo.

Editar texto

Hay muchas propiedades importantes que se pueden configurar para personalizar el comportamiento de un EditText. Varios de estos se enumeran a continuación. Consulte la guía de campos de texto oficial para obtener más detalles del campo de entrada.

Uso

Se agrega un texto de edición a un diseño con todos los comportamientos predeterminados con el siguiente XML:

<EditText
    android:id="@+id/et_simple"
    android:layout_height="wrap_content"
    android:layout_width="match_parent">
</EditText>

Tenga en cuenta que un EditText es simplemente una extensión delgada de TextView y hereda todas las mismas propiedades.

Recuperando el valor

Obtener el valor del texto introducido en un EditText es el siguiente:

EditText simpleEditText = (EditText) findViewById(R.id.et_simple);
String strValue = simpleEditText.getText().toString();

Mayor personalización de entrada

Podríamos querer limitar la entrada a una sola línea de texto (evitar nuevas líneas):

<EditText
  android:singleLine="true"
  android:lines="1"
/>

Puede limitar los caracteres que pueden ingresarse en un campo usando el atributo de dígitos:

<EditText
  android:inputType="number"
  android:digits="01"
/>

Esto restringiría los dígitos ingresados ​​a solo "0" y "1". Podríamos querer limitar el número total de caracteres con:

<EditText
  android:maxLength="5"
/>

Usando estas propiedades podemos definir el comportamiento de entrada esperado para los campos de texto.

Ajuste de colores

Puede ajustar el color de fondo de resaltado del texto seleccionado dentro de un texto de edición con la propiedad android:textColorHighlight :

<EditText
    android:textColorHighlight="#7cff88"
/>

Visualización de sugerencias de marcador de posición

Es posible que desee configurar la sugerencia para que el control EditText solicite a un usuario una entrada específica con:

<EditText
    ...
    android:hint="@string/my_hint">
</EditText>

Consejos

Cambiando el color de la línea de fondo

Suponiendo que está utilizando la biblioteca AppCompat, puede anular los estilos colorControlNormal, colorControlActivated y colorControlHighlight:

<style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorControlNormal">#d32f2f</item>
    <item name="colorControlActivated">#ff5722</item>
    <item name="colorControlHighlight">#f44336</item>
</style>

Si no ve estos estilos aplicados dentro de un DialogFragment, hay un error conocido cuando se usa el LayoutInflater pasado en el método onCreateView ().

El problema ya se ha solucionado en la biblioteca AppCompat v23. Consulte esta guía sobre cómo actualizar. Otra solución temporal es usar el diseño de la actividad en lugar del que se pasó al método onCreateView ():

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_fragment, container);
  }

Escuchando para la entrada de EditText

Echa un vistazo a las notas clásicas de los oyentes de eventos para ver cómo escuchar los cambios en un EditText y realizar una acción cuando se producen esos cambios.

Visualización de comentarios de etiquetas flotantes

Tradicionalmente, el EditText oculta el mensaje de sugerencia (explicado anteriormente) después de que el usuario comienza a escribir. Además, cualquier mensaje de error de validación tenía que ser administrado manualmente por el desarrollador.

Con TextInputLayout puede configurar una etiqueta flotante para mostrar sugerencias y mensajes de error. Puedes encontrar más detalles aquí .

Personalizando el tipo de entrada

Los campos de texto pueden tener diferentes tipos de entrada, como número, fecha, contraseña o dirección de correo electrónico. El tipo determina qué tipo de caracteres se permiten dentro del campo y puede solicitar al teclado virtual que optimice su diseño para los caracteres de uso frecuente.

De forma predeterminada, cualquier contenido de texto dentro de un control EditText se muestra como texto sin formato. Al establecer el atributo inputType , podemos facilitar la entrada de diferentes tipos de información, como números de teléfono y contraseñas:

<EditText
    ...
    android:inputType="phone">
</EditText>

Los tipos de entrada más comunes incluyen:

Tipo Descripción
textoUri Texto que se utilizará como URI
textoEmailDirección Texto que se utilizará como dirección de correo electrónico.
textPersonName Texto que es el nombre de una persona.
contraseña de texto Texto que es una contraseña que debe ser ocultada
número Un campo solo numérico
teléfono Para ingresar un número de teléfono
fecha Para ingresar una fecha
hora Por entrar un tiempo
textMultiLine Permitir múltiples líneas de texto en el campo.

El android:inputType también le permite especificar ciertos comportamientos de teclado, tales como si poner en mayúscula todas las palabras nuevas o usar características como autocompletar y sugerencias de ortografía.
Estos son algunos de los valores comunes de tipo de entrada que definen los comportamientos del teclado:

Tipo Descripción
textCapSentences Teclado de texto normal que pone en mayúscula la primera letra para cada nueva oración
textCapWords Teclado de texto normal que pone en mayúscula cada palabra. Bueno para títulos o nombres de personas
textAutoCorrect Teclado de texto normal que corrige las palabras mal escritas.

Puede configurar múltiples inputType atributos si es necesario (separados por '|').
Ejemplo:

<EditText
    android:id="@+id/postal_address"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/postal_address_hint"
    android:inputType="textPostalAddress|
                       textCapWords|
                       textNoSuggestions" />

Puede ver una lista de todos los tipos de entrada disponibles aquí .

atributo `inputype`

atributo inputype en el widget EditText : (probado en Android 4.4.3 y 2.3.3)

<EditText android:id="@+id/et_test" android:inputType="?????"/>

textLongMessage = Teclado: alfabeto / predeterminado. Botón de entrar: Enviar / Siguiente. Emoción: si. Caso: minúscula. Sugerencia: si. Añadir. carboniza a:, y. y todo

textFilter = Teclado: alfabeto / predeterminado. Botón de entrar: Enviar / Siguiente. Emoción: si. Caso: minúscula. Sugerencia: no . Añadir. carboniza a:, y. y todo

textCapWords = Teclado: alfabeto / predeterminado. Botón de entrar: Enviar / Siguiente. Emoción: si. Caso: Camel Case . Sugerencia: si. Añadir. carboniza a:, y. y todo

textCapSentences = Teclado: alfabeto / predeterminado. Botón de entrar: Enviar / Siguiente. Emoción: si. Caso: Caso de sentencia . Sugerencia: si. Añadir. carboniza a:, y. y todo

tiempo = teclado: numérico. Botón de entrar: Enviar / Siguiente. Emoción: no. Caso: -. Sugerencia: no . Añadir. caracteres::

textMultiLine = Teclado: alfabeto / predeterminado. Botón enter: siguiente línea . Emoción: si. Caso: minúscula. Sugerencia: si. Añadir. carboniza a:, y. y todo

número = teclado: numérico . Botón de entrar: Enviar / Siguiente. Emoción: no. Caso: -. Sugerencia: no. Añadir. caracteres: nada

textEmailAddress = Teclado: alfabeto / predeterminado. Botón de entrar: Enviar / Siguiente. Emoción: no . Caso: minúscula. Sugerencia: no . Añadir. caracteres: @ y . y todo

(Sin tipo) = Teclado: alfabeto / predeterminado. Botón enter: siguiente línea . Emoción: si. Caso: minúscula. Sugerencia: si. Añadir. carboniza a:, y. y todo

textPassword = Teclado: alfabeto / predeterminado. Botón de entrar: Enviar / Siguiente. Emoción: no. Caso: minúscula. Sugerencia: no . Añadir. carboniza a:, y. y todo

texto = Teclado: Teclado: alfabeto / predeterminado. Botón de entrar: Enviar / Siguiente. Emoción: si. Caso: minúscula. Sugerencia: si. Añadir. carboniza a:, y. y todo

textShortMessage = Teclado: alfabeto / predeterminado. Botón de entrar: emoción . Emoción: si. Caso: minúscula. Sugerencia: si. Añadir. carboniza a:, y. y todo

textUri = Teclado: alfabeto / predeterminado. Botón de entrar: Enviar / Siguiente. Emoción: no. Caso: minúscula. Sugerencia: no . Añadir. caracteres: / y . y todo

textCapCharacters = Teclado: alfabeto / predeterminado. Botón de entrar: Enviar / Siguiente. Emoción: si. Caso: MAYÚSCULAS . Sugerencia: si. Añadir. carboniza a:, y. y todo

teléfono = teclado: numérico . Botón de entrar: Enviar / Siguiente. Emoción: no. Caso: -. Sugerencia: no . Añadir. caracteres: *** #. - / () WPN, + **

textPersonName = Teclado: alfabeto / predeterminado. Botón de entrar: Enviar / Siguiente. Emoción: si. Caso: minúscula. Sugerencia: si. Añadir. carboniza a:, y. y todo


Nota: Auto-capitalization configuración de Auto-capitalization cambiará el comportamiento predeterminado.

Nota 2: En el Numeric keyboard , TODOS los números son 1234567890 en inglés.

Nota 3: la configuración de Correction/Suggestion cambiará el comportamiento predeterminado.

Ocultar SoftKeyboard

Ocultar Softkeyboard es un requisito básico por lo general cuando se trabaja con EditText. El teclado de teclado por defecto solo puede cerrarse presionando el botón Atrás y, por lo tanto, la mayoría de los desarrolladores usan InputMethodManager para forzar a Android a ocultar el teclado virtual que llama a hideSoftInputFromWindow y pasa el token de la ventana que contiene su vista enfocada. El código para hacer lo siguiente:

public void hideSoftKeyboard()    
{
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);    
}

El código es directo, pero otro problema importante que surge es que se debe llamar a la función de ocultar cuando ocurre algún evento. ¿Qué hacer cuando necesita que el Softkeyboard esté oculto al presionar en otro lugar que no sea su EditText? El siguiente código proporciona una función clara que debe llamarse en su método onCreate () solo una vez.

public void setupUI(View view) 
{
        String s = "inside";
        //Set up touch listener for non-text box views to hide keyboard.
        if (!(view instanceof EditText)) {

            view.setOnTouchListener(new View.OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {
                    hideSoftKeyboard();
                    return false;
                }

            });
        }

        //If a layout container, iterate over children and seed recursion.
        if (view instanceof ViewGroup) {

            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {

                View innerView = ((ViewGroup) view).getChildAt(i);

                setupUI(innerView);
            }
        }    
}

Icono o botón dentro de Texto de edición personalizado y su acción y haga clic en escuchas.

Este ejemplo ayudará a tener el texto de edición con el icono en el lado derecho.

Nota: En esto solo estoy usando setCompoundDrawablesWithIntrinsicBounds, así que si desea cambiar la posición del ícono, puede lograrlo usando setCompoundDrawablesWithIntrinsicBounds en setIcon.

public class MKEditText extends AppCompatEditText {

    public interface IconClickListener {
        public void onClick();
    }

    private IconClickListener mIconClickListener;

    private static final String TAG = MKEditText.class.getSimpleName();

    private final int EXTRA_TOUCH_AREA = 50;
    private Drawable mDrawable;
    private boolean touchDown;

    public MKEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MKEditText(Context context) {
        super(context);
    }

    public MKEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void showRightIcon() {
        mDrawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_android_black_24dp);

        setIcon();
    }

    public void setIconClickListener(IconClickListener iconClickListener) {
        mIconClickListener = iconClickListener;
    }

    private void setIcon() {
        Drawable[] drawables = getCompoundDrawables();

        setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], mDrawable, drawables[3]);

        setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        setSelection(getText().length());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        final int right = getRight();
        final int drawableSize = getCompoundPaddingRight();
        final int x = (int) event.getX();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (x + EXTRA_TOUCH_AREA >= right - drawableSize && x <= right + EXTRA_TOUCH_AREA) {
                    touchDown = true;
                    return true;
                }
                break;
            case MotionEvent.ACTION_UP:
                if (x + EXTRA_TOUCH_AREA >= right - drawableSize && x <= right + EXTRA_TOUCH_AREA && touchDown) {
                    touchDown = false;
                    if (mIconClickListener != null) {
                        mIconClickListener.onClick();
                    }
                    return true;
                }
                touchDown = false;
                break;

        }
        return super.onTouchEvent(event);
    }
}

Si desea cambiar el área táctil, puede cambiar los valores predeterminados de EXTRA_TOUCH_AREA que di como 50.

Y para Habilitar el botón y hacer clic en el oyente, puede llamar desde su Actividad o Fragmento como este,

MKEditText mkEditText = (MKEditText) findViewById(R.id.password);
mkEditText.showRightIcon();
mkEditText.setIconClickListener(new MKEditText.IconClickListener() {
            @Override
            public void onClick() {
              // You can do action here for the icon.
               
            }
        });


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow