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

Resuelto Mark asked hace 54 años • 54 respuestas

Tengo uno Activityen Android, con dos elementos:

  1. EditText
  2. ListView

Cuando Activitycomienza, EditTextinmediatamente tiene el 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 al cliente EditTextde que no se seleccione cuando Activitycomienza?

Mark avatar Jan 01 '70 08:01 Mark
Aceptado

Agregar las etiquetas android:focusableInTouchMode="true"y android:focusable="true"al diseño principal (por ejemplo, LinearLayouto 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"/>
Morgan Christiansson avatar Nov 02 '2009 15:11 Morgan Christiansson

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

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

android:windowSoftInputMode="stateHidden"- ocultarlo siempre al entrar a la actividad.

o android:windowSoftInputMode="stateUnchanged"- no cambiarlo (por ejemplo, no mostrarlo si aún no se muestra, pero si estaba abierto al ingresar a la actividad, dejarlo abierto).

Joe avatar Apr 09 '2010 21:04 Joe

Existe una solución más sencilla. Establezca estos atributos en su diseño principal:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true" >

Y ahora, cuando comience la actividad, este diseño principal recibirá el foco de forma predeterminada.

Además, podemos eliminar el foco de las vistas secundarias en tiempo de ejecución (por ejemplo, después de finalizar la edición secundaria) volviendo a centrar el foco en el diseño principal, así:

findViewById(R.id.mainLayout).requestFocus();

Buen comentario de Guillaume Perrot :

android:descendantFocusability="beforeDescendants"parece ser el valor predeterminado (el valor entero es 0). Funciona simplemente agregando android:focusableInTouchMode="true".

Realmente, podemos ver que beforeDescendantsestá configurado como predeterminado en el ViewGroup.initViewGroup()método (Android 2.2.2). Pero no es igual a 0.ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Gracias a Guillaume.

Silver avatar Dec 26 '2011 23:12 Silver

La única solución que he encontrado es:

  • Cree un LinearLayout (no sé si otros tipos de diseño funcionarán)
  • Establecer los atributos android:focusable="true"yandroid:focusableInTouchMode="true"

Y EditTextno se concentrarán después de comenzar la actividad.

Luc avatar Oct 23 '2009 08:10 Luc