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.
- "Presione y mantenga presionado" en Android necesita cambiar estados (selector XML personalizado) usando onTouchListener
- Reducir animadamente el tamaño del botón en la prensa y recuperar su tamaño en la versión
- Android dragvable ImageVIew
- Cambiar la altura del diseño relativo con la misma velocidad que el dedo del usuario Se mueve en el diseño
- Disparar Evento táctil desde la vista DialogFragment a la vista de actividad principal
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.
- OnTouchListener para toda la pantalla
- Problema en OnTouchListener para ImageView
- PopupWindow TouchInterceptor no funciona
- OnTouch dando extraños puntos de contacto Android
- Pase Android NestedScrollView desplazamientos horizontales a un padre Ver
- ¿Cómo hacer algo repetidamente mientras se presiona un botón?
- Ocultar teclado en android mientras se toca fuera Editar área de texto
- ¿Cómo puedo pasar Touch Listeners a la vista personalizada para arrastrar y soltar?
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:
.
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"
- Android 4.1: ¿Cómo comprobar las notificaciones están deshabilitadas para la aplicación?
- ¿Cómo hacer lo contrario de atributo de preferencia android: dependencia?