¿Cómo evitar que EditText gane foco cuando se inicia una actividad en Android?
Tengo uno Activity
en Android, con dos elementos:
EditText
ListView
Cuando Activity
comienza, EditText
inmediatamente 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 EditText
de que no se seleccione cuando Activity
comienza?
Agregar las etiquetas android:focusableInTouchMode="true"
y android:focusable="true"
al diseño principal (por ejemplo, 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"/>
¿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 EditText
tener 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).
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 agregandoandroid:focusableInTouchMode="true"
.
Realmente, podemos ver que beforeDescendants
está 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.
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 EditText
no se concentrarán después de comenzar la actividad.