¿Cómo evitar que EditText se enfoque cuando se inicia una actividad en Android?

3 minutos de lectura

avatar de usuario
Marca

Yo tengo un Activity en Android, con dos elementos:

  1. EditText
  2. ListView

Cuando mi Activity comienza, el EditText inmediatamente tiene foco de entrada (cursor parpadeante). No quiero que ningún control tenga foco de entrada al inicio. Lo intenté:

EditText.setSelected(false);
EditText.setFocusable(false);

Sin suerte. ¿Cómo puedo convencer a la EditText no seleccionarse a sí mismo cuando el Activity ¿empieza?

avatar de usuario
Morgan Christianson

Agregar las etiquetas android:focusableInTouchMode="true" y android:focusable="true" al diseño principal (p. ej. LinearLayout o ConstraintLayout) como en el siguiente ejemplo, solucionará el problema.

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext" 
    android:nextFocusLeft="@id/autotext"/>

  • ¿Qué hay de establecer el padre diseño a android:focusableInTouchMode="true"!

    – Muhammad Babar

    21 de marzo de 2014 a las 5:58

  • @MuhammadBabar android:focusableInTouchMode=”true” crea una vista de zoom en el emulador

    – John Smith

    16 mayo 2021 a las 23:22

  • En mi caso, agregar incluso una vista de texto también funciona

    – Arjun Verma

    1 de junio de 2021 a las 11:39

  • Si SO, me permite votar preguntas varias veces, votaré esta respuesta dos veces. Gracias hermano

    – D_K

    8 de marzo a las 12:39

avatar de usuario
José

¿El problema real es que simplemente no quieres que tenga el foco en absoluto? O no desea que muestre el teclado virtual como resultado de enfocarse en el EditText? Realmente no veo un problema con el EditText tener un enfoque en el inicio, pero definitivamente es un problema tener la ventana SoftInput abierta cuando el usuario no solicitó explícitamente enfocarse en el EditText (y abre el teclado como resultado).

Si es el problema del teclado virtual, consulte la AndroidManifest.xml elemento documentación.

android:windowSoftInputMode="stateHidden" – ocultarlo siempre al entrar en la actividad.

o android:windowSoftInputMode="stateUnchanged" – no lo cambie (por ejemplo, no show si aún no se muestra, pero si estaba abierto al ingresar a la actividad, déjelo abierto).

avatar de usuario
Pedro

La única solución que he encontrado es:

  • Crear un diseño lineal (No sé si funcionarán otros tipos de diseños)
  • Establecer los atributos android:focusable="true" y android:focusableInTouchMode="true"

Y el EditText no obtendrá el foco después de comenzar la actividad

avatar de usuario
Ziem

Lo siguiente evitará que edittext tome el foco cuando se cree, pero lo agarrará cuando lo toque.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

Por lo tanto, establece enfocable en falso en el xml, pero la clave está en Java, al que agrega el siguiente oyente:

etBonus.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        return false;
    }
});

Debido a que está devolviendo falso, es decir, no está consumiendo el evento, el comportamiento de enfoque procederá normalmente.

  • Pero esto nunca se enfocará en el futuro, ¿cómo detener el enfoque solo para la inicial (inicio de la actividad)?

    – Jayesh

    8 de marzo de 2013 a las 7:46

  • El onTouchListener se llama antes que otras acciones táctiles. Entonces, al habilitar el enfoque en el toque, el enfoque estándar ocurre en el primer toque. Aparecerá el teclado y todo.

    – Mince Man

    9 de marzo de 2013 a las 16:36

  • ¡Lindo! Este funciona (aunque parece sacar el campo de la secuencia TAB de manejo de enfoque). Esto se puede hacer todo en un solo lugar sin una parte XML de diseño: if (Build.VERSION.SDK_INT <= 27) {et.setFocusable(false); et.setOnTouchListener(...);}

    – Jerry101

    27 de marzo a las 23:32

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad