soft - how to close keyboard android studio
EditText en Listview pierde el foco cuando se presiona en Android 4.x (9)
Sé que hay muchas preguntas similares aquí, pero no pude obtener ninguna de las soluciones proporcionadas que funcionan en una aplicación de muestra simple.
El problema ocurre cuando se muestra el teclado por primera vez. Tan pronto como se muestre, solo presionando EditText nuevamente lo hace editable.
Probé lo siguiente:
android:windowSoftInputMode="adjustPan|adjustResize"
Esto no soluciona ningún problema. Parece que esta línea es obligatoria para cambiar el tamaño de la actividad después de que aparezca el teclado. Desafortunadamente, también está causando que los EditTexts pierdan el foco. Probablemente esto se deba al ListView mismo que se enfoca después del proceso de cambio de tamaño. Así que probé la siguiente solución alternativa:
listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
Esto siempre causa el primer EditText visible que el ListView
contiene para obtener el foco, lo cual es indeseable. El segundo EditText en la segunda fila debería, en cambio, enfocar cuando se presiona, lo que no está sucediendo. Además, si finalmente conseguí enfocar otro EditText distinto del primero mostrado (por ejemplo, presionando ''Siguiente'' en el softkeyboard
), el primero visible recibirá el foco después de que el teclado se cierre y el ListView vuelva a cambiar a tamaño completo .
onFocusChange()
varias otras cosas, como interceptar eventos de onFocusChange()
para ListView, mientras sabía qué EditText había pulsado TouchListener
. Solicitar el enfoque para ese cierto EditText de nuevo tampoco condujo a ningún éxito.
El uso de un ScrollView
lugar de un ListView
según lo sugerido por otros usuarios tampoco es una opción para el proyecto en cuestión.
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 envolver Listview
en un diseño lineal con una altura de la mitad de la pantalla.
Cuando Listview
no cubre el teclado, todo está bien.
En mi caso agregué el valor local actualmenteFocusedRow en mi Adaptador. En el método getView () he agregado estos códigos 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 con recyclerView
y probando 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 comenzó a funcionar como se esperaba, no se estableció ningún valor android:windowSoftInputMode="adjustResize"
y se usó android:windowSoftInputMode="adjustResize"
Estaba teniendo problemas con el foco de "robo" de ActionBar cuando presioné un EditText ubicado dentro de una fila de 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, agregué esto a mi ListView:
android:descendantFocusability="beforeDescendants"
y agregué 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 viejo, pero esta respuesta podría ser útil para alguien, así que aquí está:
Cambie a RecyclerView y no tendrá que preocuparse por estos problemas molestos de ListView. En lugar de crear una nueva vista, recicla y reutiliza vistas anteriores.
Un truco clásico para situaciones como esta es utilizar un controlador y postDelayed()
. En tu 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 si el error de enfoque se manifiesta de forma diferente en diferentes versiones de Android o roms.
También hay muchos otros problemas con la incrustación de un EditText
dentro de un ListView
que tienen soluciones que se sienten como un truco. Ver a todas las other people luchando.
También es muy fácil que suceda algo como esto:
.
Después de haber seguido caminos similares muchas veces, en su mayoría he desistido de intentar anular cualquiera de los comportamientos o peculiaridades predeterminados del teclado. Yo recomendaría tratar de encontrar una solución alternativa en su aplicación si es posible.
¿Ha considerado que las filas de ListView
sean solo TextView
estilo y luego mostrar un EditText
Dialog
con EditText
cuando se hace clic en una fila, actualizando TextView según sea necesario?
Utilice la vista de reciclador, esto resuelve varios problemas de la lista y la vista de grilla. Incluso puede trabajar con vistas de grillas escalonadas. Podría comenzar a trabajar fácilmente con este http://android-er.blogspot.com.co/2015/07/staggeredgridlayoutmanager-google-app.html
estaba teniendo el mismo problema Se buscaron todas las soluciones con InputMode, Focusability et al. La mejor solución, migrar a la vista de reciclador.