EditText en ListView pierde foco cuando se presiona en Android 4.x

Sé que hay un montón de preguntas similares aquí, pero no pude obtener ninguna de las soluciones proporcionadas trabajando en una aplicación de ejemplo simple.

El problema se produce cuando se muestra la placa de teclado por primera vez. Tan pronto como se muestra, sólo presionando el editText de nuevo lo hace editable.

Intentó lo siguiente:

android:windowSoftInputMode="adjustPan|adjustResize" 

Esto no es resolver ningún problema. Parece que esta línea es obligatoria para que la actividad se vuelva a clasificar según el tamaño después de que el teclado virtual aparezca. Desafortunadamente, también está causando que cualquier EditTexts pierda el foco. Esto es probablemente para el propio ListView ganar el foco después del proceso de cambio de tamaño. Así que probé la siguiente solución:

  listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 

Esto siempre hace que el primer EditText visible que contiene el ListView para ganar el foco, que es indeseable. El segundo EditText en la segunda fila en lugar de ganar el foco cuando se presiona, lo que no está sucediendo. Además, si finalmente conseguí enfocar otro EditText otro que el primero mostrado (por ejemplo, presionando 'Next' en el softkeyboard ), el primer visible recibirá el foco después de que el teclado sea descartado y el ListView sea cambiado a tamaño completo nuevamente .

He intentado varias otras cosas como la interceptación onFocusChange() eventos para el ListView, a la vez que saber que EditText fue presionado por su TouchListener . Solicitar el enfoque para que ciertos EditText de nuevo tampoco conduce a ningún éxito.

El uso de ScrollView lugar de ListView como lo sugieren otros usuarios no es una opción para el proyecto en cuestión.

Un hack clásico para situaciones como esta es usar un handler y postDelayed() . En su adaptador:

 private int lastFocussedPosition = -1; private Handler handler = new Handler(); public View getView(final int position, View convertView, ViewGroup parent) { // ... edittext.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { handler.postDelayed(new Runnable() { @Override public void run() { if (lastFocussedPosition == -1 || lastFocussedPosition == position) { lastFocussedPosition = position; edittext.requestFocus(); } } }, 200); } else { lastFocussedPosition = -1; } } }); return convertView; } 

Esto funciona en mi dispositivo, pero mantenga este código fuera de producción. Tampoco me sorprendería que el error de enfoque se manifieste de forma diferente en diferentes versiones o roms de Android.

También hay muchos otros problemas con la incorporación de un EditText dentro de un ListView que tienen soluciones que se sienten como un hack. Vea a todas las otras personas luchando.

También es muy fácil tener algo como esto suceda:

Me gusta esto .

Después de haber recorrido caminos similares muchas veces, he renunciado a intentar anular cualquiera de los comportamientos o peculiaridades del teclado predeterminado. Recomiendo tratar de encontrar una solución alternativa en su aplicación si es posible.

¿Ha considerado que las filas ListView sean sólo TextView estilo y luego mostrar un EditText Dialog con un EditText cuando se hace clic en una fila, actualizando TextView si es necesario?

Tenía problemas con el foco "robar" de ActionBar cuando presioné un EditText situado dentro de una fila ListView. Las soluciones anteriores no funcionaron, pero la siguiente solución funcionó para mí:

http://www.mysamplecode.com/2013/02/android-edittext-listview-loses-focus.html

Básicamente lo agregué a mi ListView:

 android:descendantFocusability="beforeDescendants" 

Y agregó esto a mi actividad:

 android:windowSoftInputMode="adjustPan" 

Modifique su manifiesto xml para agregar windowSoftInputMode en su actividad:

 <activity android:name=".YourActivity" android:windowSoftInputMode="adjustPan"> </activity> 

Sé que es un hilo muy antiguo, pero esta respuesta podría ser útil para alguien por lo que aquí es:

Cambie a RecyclerView y no tendrá que preocuparse por estos problemas molestos de ListView. En lugar de hacer una nueva vista, recicla y reutiliza las viejas opiniones.

Usar reciclar Ver, esto resuelve varios problemas de la lista y la vista de cuadrícula. Yo puede incluso trabajar con gridviews escalonados. Yo podría fácilmente empezar a trabajar con este http://android-er.blogspot.com.co/2015/07/staggeredgridlayoutmanager-google-app.html

Cuando la lista es lo suficientemente larga para cubrir el teclado EditText , EditText en EditText pierde el foco cuando se presiona en Android 4.x.

Una solución es ajustar el Listview en un diseño lineal con una altura de la mitad de la pantalla.

Siempre que el Listview no cubre el software, todo está bien.

En mi caso he añadido el valor local actualFocusedRow en mi adaptador. En el método getView () he añadido este código a cada editText:

  if (currentlyFocusedRow == position) { editText.requestFocus(); } editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { if (currentlyFocusedRow == -1) { currentlyFocusedRow = position; } } else { currentlyFocusedRow = -1; } } }); 

Estaba teniendo el mismo problema. Se buscan todas estas soluciones con inputMode, focusability et al. La mejor solución, migrar a la vista del reciclador.

Yo estaba teniendo el mismo problema con recyclerView y probar todas las soluciones sugeridas.

Finalmente, el problema en mi caso era que el recyclerView tenía wrap_content como valor para la altura en mi XML por accidente; Lo cambió a match_parent y empezó a funcionar como se esperaba, no se puede establecer un valor android:windowSoftInputMode="adjustResize" y usar android:windowSoftInputMode="adjustResize"

  • SwipeListView sólo un elemento abierto a la vez
  • Usando OnTouchListener y OnLongClickListener interfiere entre sí
  • Saltar ImageView mientras arrastra. Los valores de getX () y getY () saltan
  • Combinación de combinación de Android :: OnTouchListener && OnClickListener
  • ¿Es OnTouchListener más rápido que OnClickListener?
  • Diseño con posición dinámica
  • Cómo implementar tanto ontouch y también onfling en un mismo listview?
  • Limitación de Drag de ImageView en Android
  • Cómo implementar OnTouch Listener en XML
  • OnTouch funciona, pero OnClickListener no?
  • Cómo combinar OnClickListener y OnTouchListener para un ImageButton
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.