Excelentes respuestas de Luc y Mark, sin embargo, falta un buen ejemplo de código. Agregar la etiqueta 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"/>
Morgan Christiansson
fuente
android:focusableInTouchMode="true"
!android:focusableInTouchMode="true"
cubreandroid:focusable="true"
+ un poco más, por lo que en este casoandroid:focusable="true"
es innecesario y puede eliminarse. Además, la vista ficticia puede ser una Vista en lugar de un Diseño lineal. Esto ahorra poder de procesamiento + lo salva de algunas advertencias. Por lo tanto, mi recomendación es reemplazar la vista ficticia con<View android:focusableInTouchMode="true" android:layout_width="0px" android:layout_height="0px"/>
¿Es el problema real que simplemente no quieres que tenga foco en absoluto? ¿O no quieres que muestre el teclado virtual como resultado de enfocar el
EditText
? Realmente no veo un problema conEditText
tener el foco en el inicio, pero definitivamente es un problema tener abierta la ventana softInput cuando el usuario no solicitó explícitamente enfocarse en elEditText
(y abrir el teclado como resultado).Si es el problema del teclado virtual, consulte la documentación del
AndroidManifest.xml
elemento <actividad> .android:windowSoftInputMode="stateHidden"
- siempre lo oculta al ingresar a la actividad.o
android:windowSoftInputMode="stateUnchanged"
- no lo cambie (p. ej., no lo muestre si aún no se muestra, pero si estaba abierto al ingresar a la actividad, déjelo abierto).fuente
EditText
enfocara. En realidad, establece claramente que así es como evita que el teclado IME del software se abra automáticamente al enfocar; porque es más probable que la mayor preocupación sea el teclado suave que aparece inesperadamente, no el foco en sí. Si su problema es queEditText
realmente se está enfocando, use la respuesta de otra persona.Existe una solución más simple. Establezca estos atributos en su diseño principal:
Y ahora, cuando comienza la actividad, este diseño principal se enfocará de manera predeterminada.
Además, podemos eliminar el foco de las vistas secundarias en tiempo de ejecución (por ejemplo, después de terminar la edición secundaria) volviendo a enfocar el diseño principal, de esta manera:
Buen comentario de Guillaume Perrot :
Realmente, podemos ver que el
beforeDescendants
conjunto está predeterminado en elViewGroup.initViewGroup()
método (Android 2.2.2). Pero no es igual a 0.ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;
Gracias a Guillaume.
fuente
La única solución que he encontrado es:
android:focusable="true"
yandroid:focusableInTouchMode="true"
Y
EditText
no obtendrá el foco después de comenzar la actividadfuente
El problema parece provenir de una propiedad que solo puedo ver en
XML form
el diseño.Asegúrese de eliminar esta línea al final de la declaración dentro de las
EditText
etiquetas XML:Eso debería dar algo así:
fuente
Utilizando la información proporcionada por otros carteles, utilicé la siguiente solución:
en el diseño XML
en onCreate ()
y finalmente, en onResume ()
fuente
Pruebe clearFocus () en lugar de
setSelected(false)
. Cada vista en Android tiene enfocabilidad y capacidad de selección, y creo que solo quieres aclarar el enfoque.fuente
myEditText.clearFocus(); myDummyLinearLayout.requestFocus();
aonResume
la actividad. Esto aseguró que EditText no mantuviera el foco cuando se giraba el teléfono.Lo siguiente evitará que edittext se enfoque cuando se cree, pero tómalo cuando los toques.
Por lo tanto, establece focusable en false en el xml, pero la clave está en java, a la que agrega el siguiente oyente:
Debido a que está devolviendo falso, es decir, no está consumiendo el evento, el comportamiento de enfoque continuará como de costumbre.
fuente
Intenté varias respuestas individualmente, pero el foco todavía está en EditText. Solo logré resolverlo usando dos de las siguientes soluciones juntas.
(Referencia de Silver https://stackoverflow.com/a/8639921/15695 )
y quitar
en EditText
(Referencia de floydaddict https://stackoverflow.com/a/9681809 )
fuente
Respuesta tardía pero más simple, solo agregue esto en el diseño principal del XML.
¡Vota si te ayudó! Happy Coding :)
fuente
Ninguna de estas soluciones funcionó para mí. La forma en que solucioné el enfoque automático fue:
fuente
Solución simple:
AndroidManifest
en elActivity
uso de etiquetasfuente
Puede configurar "enfocable" y "enfocable en modo táctil" para que sea verdadero en el primero
TextView
de loslayout
. De esta manera, cuando comience la actividadTextView
, se enfocará pero, debido a su naturaleza, no verá nada enfocado en la pantalla y, por supuesto, no se mostrará ningún teclado ...fuente
Lo siguiente funcionó para mí en
Manifest
. Escribir ,fuente
Necesitaba despejar el foco de todos los campos mediante programación. Acabo de agregar las siguientes dos declaraciones a mi definición de diseño principal.
Eso es. Solucioné mi problema al instante. Gracias, Silver, por señalarme en la dirección correcta.
fuente
Agregue
android:windowSoftInputMode="stateAlwaysHidden"
la etiqueta de actividad delManifest.xml
archivo.Fuente
fuente
Si tiene otra vista de su actividad como a
ListView
, también puede hacer:en su
onResume()
para captar el foco de laeditText
.Sé que esta pregunta ha sido respondida, pero solo proporcioné una solución alternativa que me funcionó :)
fuente
Pruebe esto antes de su primer campo editable:
fuente
Agregue lo siguiente en el
onCreate
método:fuente
Siendo que no me gusta contaminar el XML con algo relacionado con la funcionalidad, creé este método que "transparentemente" roba el foco de la primera vista enfocable y luego se asegura de eliminarlo cuando sea necesario.
fuente
Tarde, pero tal vez útil. Crear un EditarTexto ficticia en la parte superior de su diseño a continuación, llamar
myDummyEditText.requestFocus()
enonCreate()
Eso parece comportarse como espero. No es necesario manejar cambios de configuración, etc. Necesitaba esto para una Actividad con un TextView largo (instrucciones).
fuente
Escriba esta línea en su Diseño para padres ...
fuente
Sí, hice lo mismo: crear un diseño lineal 'ficticio' que obtiene el foco inicial. Además, configuro las 'siguientes' ID de foco para que el usuario no pueda enfocarlo más después de desplazarse una vez:
mucho trabajo solo para deshacernos del foco en una vista ...
Gracias
fuente
Para mí, lo que funcionó en todos los dispositivos es esto:
Simplemente ponga esto como una vista antes de la vista enfocada problemática, y eso es todo.
fuente
Lo más simple que hice es establecer el foco en otra vista en onCreate:
Esto detuvo la aparición del teclado virtual y no hubo parpadeo del cursor en EditText.
fuente
Esta es la solución más fácil y perfecta. Siempre uso esto en mi aplicación.
fuente
fuente
Escriba este código dentro del
Manifest
archivo en elActivity
que no desea abrir el teclado.Archivo de manifiesto:
fuente
En
onCreate
su Actividad, simplemente agregue usoclearFocus()
en su elemento EditText. Por ejemplo,Y si desea desviar el enfoque a otro elemento, úselo
requestFocus()
. Por ejemplo,fuente
Uso el siguiente código para evitar que un EditText robe el foco cuando presiono mi botón.
Básicamente, oculta el texto de edición y luego muéstralo nuevamente. Esto funciona para mí ya que EditText no es a la vista, por lo que no importa si se muestra.
Podría intentar esconderse y mostrarlo sucesivamente para ver si eso lo ayuda a perder el foco.
fuente