0 votos

Hola, tengo problemas para ocular el teclado, en realidad el teclado se oculta, pero se queda como el fondo de donde estaba antes el teclado.

 
En el siguiente gif se puede ver que, al escribir en el EditText, el teclado se muestra, pero al intentar ocultarlo desde la flecha física del móvil, paso lo siguiente:

Eso mismo también pasa cuando pulso en unos botones que tengo para guardar el documento, borrarlo, etc.. el teclado desaparece, pero se queda ese fondo.

Para ocultar el teclado tengo puesto este código en una actividad que extiende de un Fragment :

CerraTeclado();

private void CerrarTeclado() {
    View view = getActivity().getCurrentFocus();
    if (view != null) {
        InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(),0);
    }
}

Que puedo hacer para que se oculte el teclado y no se quede esa especie de fondo que contenía el teclado?

Gracias.

por en Android
editado por

1 Respuesta

0 votos

Debería funcionarte con las opciones de "android:windowSoftInputMode", concreatamente con "adjustResize", tienes todas las opciones que te sugiero echar un vistazo en: https://developer.android.com/guide/topics/manifest/activity-element#wsoft  .También tienes ejemplos y más información en: https://developer.android.com/training/keyboard-input/visibility

Si lo anterior no te funcionara, también podrías ser debido a que el layout_height del padre esté ajustado al contenido (wrap_content).

por
Hola Ramon, el esta: layout_height="match_parent"

Con el windowSoftInputMode, he estado haciendo pruebas, y ahora lo tengo así, pero sigue cerrándose mal.

android:windowSoftInputMode="stateAlwaysHidden|adjustPan|stateUnchanged|adjustResize"
Muchas opciones tienes ahí puestas, probaría a quitar todas y dejar solo "adjustResize" o "adjutsPan".

Sino te funcionara, quizás englobaría todas las views en un ScrollView y pondría en el manifest "adjustResize" en "android:windowSoftInputMode".

Esas opciones que ves, es de la última prueba, pero siempre he tenido una o dos, voy a probar a dejar solo "adjustResize" 

 

Lo de englobar todas las views en un ScrollView, a que te refieres, en los xml de cada pestaña, configurar el primero como ScrollView, algo como:

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">


<EditText
  ....
  ....
  ..../>

<com.google.android.material.button.MaterialButton
  ....
  ....
  ..../>

    </LinearLayout>

</ScrollView>

Es que si es esto, antes los tienia así, pero me mostraba un error de que tenia que tener solo un ScrollView, o algo asi, no lo recuerdo bien, pero estaba claro que tenia solo uno de luego solo un LinearLayout, y dentro de este todos los demas.

Justo a eso me refería sobre englobar las vistas dentro de un scrollview.

Nada Ramon, sigue igual, he configurado el android:windowSoftInputMode y puesto como padre el ScrollView

Mira esta captura, las pestañas de los diferentes menus se ven completas, cuando muestro el telclado se queda ese fondo azul, y si cambio a otras pestañas, ese fondo sigue estando, no lo entiendo.

 

 

este es un proyecto para realizar pruebas, pero en otro proyecto digamos que es el principal paso exactamente lo mismo, 

¿Has probado con otra versión de Android o un dispositivo físico?

También, se me ocurre que la manera de ocultar del teclado te esté ocasionando el problema al usar "getActivity()", puedes probar con:

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

O desde la vista:

InputMethodManager inputManager = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);

 

Lo que pasa, es que ese codigo lo tengo puesto en CerraTeclado() vamos cuando yo le digo que lo cierre, pero si esta abierto el teclado y pulso el boton fisico del movil, no pasa por CerraTeclado()

 

Como puedes ver en esa captura, no llego a pulsar el boton de aceptar, que es cuando le digo CerraTeclado(), solo pulso el boton fisico del movil para ir atras.

 

no se si hay alguna forma de detectar cuando se pulsa el teclado fisico, y entonces darla la orden de cerrarlo mediante codigo.

He probado con este otro codigo, pero se ve que no esta bien que no me llego a funcionar

@Override
public void onAttach(Context context) {
    super.onAttach(context);
	//Mostrar teclado cuando se haya adjunto cualquier fragmento de esta clase
    showSoftwareKeyboard(false);
}

@Override
public void onDetach() {
    super.onDetach();
    //ocultar el teclado cuando se haya separado cualquier fragmento de esta clase
    showSoftwareKeyboard(false);
}


protected void showSoftwareKeyboard(boolean showKeyboard){
    final Activity activity = getActivity();
    final InputMethodManager inputManager = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), showKeyboard ? InputMethodManager.SHOW_FORCED : InputMethodManager.HIDE_NOT_ALWAYS);
}

 

 

Bueno pues ya parece que funciona, con este codigo:

 private void CerrarTeclado_2(EditText introLogin) {
        InputMethodManager imm = (InputMethodManager) getContext().getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(introLogin.getApplicationWindowToken(), 0);
    }

Pero ahora he descubierto otro problema, lo he puesto en un post aparte:

https://jarroba.com/foro/2042/como-desplazar-pantalla-al-mostrar-teclado