0 votos

Hola, voy a preguntarlo aquí, a ver si tengo más suerte, porque lo he preguntado en otro sitio, pera esta en ingles, y nunca me ha respondido, igual como no tengo idea de ingles no lo he escrito bien.

Bueno, os cuento porque llevo tiempo con esto y no encuentro una solución.

Dependiendo de cómo configure el AndroidManifest, funciona de una formo o de otra, pero nunca bien.

Si en el AndroidManifest lo configuro como:

android:windowSoftInputMode="adjustPan"

El fragment que está configurado con un androidx.core.widget.NestedScrollView no tiene ningún efecto, la pantalla no se desplaza, y el teclado se oculta sin dejar rastro.

Después en AndroidManifest se configura como:

android:windowSoftInputMode="adjustResize"

La Pantalla SI se desplaza correctamente, pero cuando se oculta el teclado, deja un fondo.

Esto ocurre en todas las actividades donde tengo que mostrar el teclado.
¿Me podéis ayudar? 

 

 

 

por en Android

1 Respuesta

0 votos

Buenas.

Creo que está relacionado con https://jarroba.com/foro/2042/como-desplazar-pantalla-al-mostrar-teclado

Y posiblemente te ayude la solución de:

https://stackoverflow.com/questions/42597256/background-glitch-on-keyboard-closure

Que traduzco:

Usa en el onCreate() de tu actividad base y después de super.onCreate(savedInstanceState);

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

O bien, añade las siguientes líneas a tu Manifest dentro del tag activity:

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:windowSoftInputMode="stateHidden|adjustPan"

 

por
Perdona por no responderte en el otro post, pero entre al post durante algunos días y al no ver respuesta, pensé que ya nadie respondería, y el problema que tengo, es que no recibo o no me llegan las notificaciones, y no puedo ver si alguien responde.

Te responde aquí ya que está relacionado, será una respuesta un poco larga, pero primero te comento lo que ya he probado, y luego voy a hacer pruebas con lo que me dices y ya te comentare.
Pero dejando todo dentro del ScrollView como principal, no ha funcionado, ahora lo tengo dentro del RelativeLayout, y según he leído para estar dentro es mejor ponerlo como androidx.core.widget.NestedScrollView, pero da igual en el lugar que lo ponga, el fondo del teclado sigue quedándose.

Y creo que fue ahí cuando en su día probé con ese código, y me ha estado funcionando hasta ahora que he visto el problema que tengo, por eso lo he vuelto a preguntar, porque me pasa esto….. si tengo una actividad con un EditText con ese código, funciona bien, vuelvo a entrar a esa actividad y sigue funcionando, pero como entre a otra actividad distinta con otro EditText y con el mismo código, cuando quito el teclado ya no funciona, y si vuelva a la actividad anterior, también ha dejado de funcionar.

No sé si me he explicado bien, y has llegado a entender este lio, el caso es si dejo el  android:windowSoftInputMode="adjustResize|adjustPan" el teclado se cierra sin dejar el fondo, pero no funciona el ScrollView.

Voy a hacer pruebas, a ver si con lo que me dices se consigue algo, al poner y quitar código, porque dejando juntos el “adjustResize|adjustPan" tampoco funciona, y como ves, si se utilizan por separado, funciona una cosa y deja de funcionar otra.

Llevo todo el día haciendo pruebas, y funciona a medias, digo que, a medias, porque tengo dos actividades que extienden de Fragmet, cada una tiene varios EditText, si entro al Fragment 1, de la forma que lo he puesto ahora funciona, se muestra el teclado, y al quitarlo no se muestra el fondo, pero si después me voy y entro al Fragment 2, no funciona, se queda el fondo del teclado.

Si salgo de la aplicación, y ahora hago la prueba al revés, pasa lo mismo, si entro primero al Fragment 2, funciona bien, si luego me voy al Fragment 1, ya no funciona.

He probado también dejando el ScrollView primero y luego el RelativeLayout, y da igual donde lo ponga, tampoco funciona. 


Si pongo el código que dices, no funciona el ScrollView, así que he tenido que poner los dos, este es el código que estoy probando ahora:


AndroidManifest:

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:windowSoftInputMode="stateHidden|adjustPan|adjustResize">

En el Fragment:

He tenido que agregar esto: AndroidBug5497Workaround.assistActivity(getActivity()); 

View.OnKeyListener keyListener = new View.OnKeyListener() {

    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.KEYCODE_BACK) {
            
            CerrarTeclado_2(binding.editTextTest);
        }
        return false;
    }
};

@Override
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

    AndroidBug5497Workaround.assistActivity(getActivity());
}


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

Y es más, he creado un proyecto nuevo, siguiendo este video: https://www.youtube.com/watch?v=FOibPikr0qc

Y ese proyecto muestra el teclado, y se esconde sin dejar el fondo, lo raro es que paso ese código a la otra aplicación, y ese código ya no funciona, no lo entiendo.

 

Eso sí que es raro, si te funciona en una APP y no en otra.

Me da que pueda ser un problema con la versión de Android o que haya algún parámetro del manifest/Activity que esté causando el conflicto, pero tampoco te sabría decir más.

Otra solución más drástica que se me ocurre, si en la APP del ejemplo te funciona, puedes llevarte todo el código de tu otra APP a la que funciona y probar a ver, también te servirá para detectar lo que está provocando el fallo.