He pasado alrededor de 6 horas en esto hasta ahora y no he encontrado más que obstáculos. La premisa general es que hay alguna fila en un ListView
(ya sea generado por el adaptador o agregado como una vista de encabezado) que contiene un EditText
widget y un Button
. Todo lo que quiero hacer es poder usar el jogball / flechas, para navegar el selector a elementos individuales como de costumbre, pero cuando llego a una fila en particular, incluso si tengo que identificar explícitamente la fila, eso tiene un enfoque niño, quiero que ese niño se enfoque en lugar de indicar la posición con el selector.
He probado muchas posibilidades y hasta ahora no he tenido suerte.
diseño:
<ListView
android:id="@android:id/list"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
/>
Vista de encabezado:
EditText view = new EditText(this);
listView.addHeaderView(view, null, true);
Suponiendo que hay otros elementos en el adaptador, el uso de las teclas de flecha moverá la selección hacia arriba o hacia abajo en la lista, como se esperaba; pero al llegar a la fila del encabezado, también se muestra con el selector, y no hay forma de enfocarse en el EditText
uso del jogball. Nota: tocando en elEditText
se enfocará en ese punto, sin embargo, eso depende de una pantalla táctil, que no debería ser un requisito.
ListView
aparentemente tiene dos modos a este respecto:
1 setItemsCanFocus(true)
.: el selector nunca se muestra, pero el EditText
puede enfocarse al usar las flechas. El algoritmo de búsqueda de enfoque es difícil de predecir y no hay comentarios visuales (en ninguna fila: tener hijos enfocables o no) sobre qué elemento se selecciona, los cuales pueden brindar al usuario una experiencia inesperada.
2 setItemsCanFocus(false)
.: el selector siempre se dibuja en modo no táctil y EditText
nunca puede enfocarse, incluso si lo toca.
Para empeorar las cosas, la llamada editTextView.requestFocus()
devuelve verdadero, pero de hecho no da el foco EditText.
Lo que estoy imaginando es básicamente un híbrido de 1 y 2, donde en lugar de la configuración de la lista si todos los elementos son enfocables o no, quiero establecer la capacidad de enfoque para un solo elemento en la lista, de modo que el selector pase sin problemas de seleccionar el fila completa para elementos no enfocables y atravesar el árbol de enfoque para elementos que contienen elementos secundarios enfocables.
¿Ningún arrendatario?
descendantFocusability="afterDescendants"
permitirá que su EditText se enfoque dentro de ListView, pero luego no obtendrá ningún selector de elementos de lista mientras navega con un dpad. Mi tarea era tener el selector de elementos de la lista en todas las filas excepto en la que tiene EditText. Aunque me alegro de que haya ayudado. FWIW, terminamos reevaluando esta implementación y decidimos que un enfoque dentro de un ListView simplemente no es un diseño idiomático de la interfaz de usuario de Android, por lo que descartamos la idea a favor de un enfoque más compatible con Android.Eso me ayudó.
En tu manifiesto:
fuente
OnItemSelectedListener
no cambia eso. Sin embargo, la sencilla solución de Iogan funciona de maravilla, ¡gracias!android:descendantFocusability
propiedad más de Joe obtuve miEditText
s dentro de unaListView
resolución del teclado correctamente, votó a ambos.android:descendantFocusability
por sí solo no funcionó y no estaba ni remotamente entusiasmado con@Overriding
onItemSelected
los 14EditText
s con los que tengo que lidiar. :) ¡Gracias!Mi tarea era implementar lo
ListView
que se expande cuando se hace clic. El espacio adicional muestraEditText
dónde puede ingresar texto. La aplicación debe ser funcional en 2.2+ (hasta 4.2.2 al momento de escribir esto)Probé numerosas soluciones de esta publicación y otras que pude encontrar; los probé en dispositivos 2.2 hasta 4.2.2. Ninguna de las soluciones fue satisfactoria en todos los dispositivos 2.2+, cada solución presentaba problemas diferentes.
Quería compartir mi solución final:
android:descendantFocusability="afterDescendants"
setItemsCanFocus(true);
android:windowSoftInputMode="adjustResize"
Mucha gente sugiere,adjustPan
peroadjustResize
da mucho mejor ux en mi humilde opinión, solo pruebe esto en su caso. ConadjustPan
usted obtendrá los elementos de la lista inferior oscurecidos, por ejemplo. Los documentos sugieren que ("Por lo general, esto es menos deseable que cambiar el tamaño"). También en 4.0.4 después de que el usuario comienza a escribir en el teclado virtual, la pantalla se desplaza hacia la parte superior.adjustResize
hay algunos problemas con el foco EditText. La solución es aplicar la solución rjrjr de este hilo. Parece aterrador pero no lo es. Y funciona. Solo inténtalo.Adicional 5. Debido a que el adaptador se actualiza (debido al cambio de tamaño de la vista) cuando
EditText
se enfoca en las versiones anteriores de HoneyComb, encontré un problema con las vistas invertidas: obteniendo Vista para el elemento ListView / orden inverso en 2.2; funciona en 4.0.3Si está haciendo algunas animaciones, es posible que desee cambiar el comportamiento
adjustPan
para las versiones anteriores al panal para que el cambio de tamaño no se active y el adaptador no actualice las vistas. Solo necesitas agregar algo como estoTodo esto da una ux aceptable en dispositivos 2.2 - 4.2.2. Espero que le ahorre a la gente algo de tiempo, ya que me tomó al menos varias horas llegar a esta conclusión.
fuente
Esto me salvó la vida --->
establecer esta línea
ListView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
Luego, en su manifiesto en la etiqueta de actividad, escriba esto ->
<activity android:windowSoftInputMode="adjustPan">
Tu intención habitual
fuente
Estamos probando esto en una lista corta que no hace ningún reciclaje. Hasta aquí todo bien.
XML:
Java:
fuente
esta publicación coincidía exactamente con mis palabras clave. Tengo un encabezado ListView con un EditText de búsqueda y un botón de búsqueda.
Para enfocar el EditText después de perder el enfoque inicial, el único HACK que encontré es:
Perdí muchas horas y no es una solución real. Espero que ayude a alguien duro.
fuente
Si la lista es dinámica y contiene widgets enfocables, entonces la opción correcta es usar RecyclerView en lugar de ListView IMO.
Las soluciones provisionales que establecen
adjustPan
,FOCUS_AFTER_DESCENDANTS
o recuerdan manualmente la posición enfocada, son de hecho solo soluciones provisionales. Tienen casos de esquina (desplazamiento + problemas de teclado suave, cambio de posición de intercalación en EditText). No cambian el hecho de que ListView crea / destruye vistas en masa durantenotifyDataSetChanged
.Con RecyclerView, notifica sobre inserciones, actualizaciones y eliminaciones individuales. La vista enfocada no se está recreando, por lo que no hay problemas con los controles de formulario que pierden el enfoque. Como beneficio adicional, RecyclerView anima las inserciones y eliminaciones de elementos de la lista.
Aquí hay un ejemplo de documentos oficiales sobre cómo comenzar con
RecyclerView
: Guía para desarrolladores : cree una lista con RecyclerViewfuente
algunas veces, cuando lo usa
android:windowSoftInputMode="stateAlwaysHidden"
en una actividad de manifiesto o xml, esa vez perderá el enfoque del teclado. Entonces, primero verifique esa propiedad en su xml y manifiesto, si está allí, simplemente elimínela. Después de agregar estas opciones al archivo de manifiesto en la actividad lateralandroid:windowSoftInputMode="adjustPan"
y agregar esta propiedad a la vista de lista en xmlandroid:descendantFocusability="beforeDescendants"
fuente
Otra solución simple es definir su onClickListener, en el método getView (..), de su ListAdapter.
De esa manera, se puede hacer clic en su fila y también en su vista interior :)
fuente
La parte más importante es hacer que el enfoque funcione para la celda de la lista. Especialmente para la lista en Google TV, esto es esencial:
El método setItemsCanFocus de la vista de lista hace el truco:
Mi lista de celdas xml comienza de la siguiente manera:
nextFocusLeft / Right también son importantes para la navegación del D-Pad.
Para obtener más detalles, consulte las otras excelentes respuestas.
fuente
Acabo de encontrar otra solución. Creo que es más un truco que una solución, pero funciona en Android 2.3.7 y Android 4.3 (incluso he probado ese viejo D-pad)
inicie su vista web como de costumbre y agregue esto: (gracias Michael Bierman)
Durante la llamada getView:
fuente
Solo prueba esto
en el
sección de su manifiesto. Sí, no ajusta nada, lo que significa que editText permanecerá donde está cuando se abra IME. Pero eso es solo un pequeño inconveniente que aún resuelve por completo el problema de perder el enfoque.
fuente