¿Por qué android InputMethodManager.showSoftInput () devuelve false?

Recientemente, mientras desarrollaba una aplicación, me enfrenté a un problema. He buscado mucho en google pero no pude encontrar ninguna solución. Al final me encontré con este controlador de problemas de Android

Para explicar mi problema, he hecho una muestra de la aplicación.

Trabajo básico de mi aplicación de ejemplo

  1. Tengo una pantalla, que tiene un EditText, un botón y un RelativeLayout.
  2. Anchura y altura de RelativeLayout es 0px. Es sólo una vista para mover el enfoque lejos de EditText.
  3. Cuando se lanza la aplicación, el foco está en RelativeLayout, no en EditText (para que no haya un cursor parpadeante en él).
  4. Cuando un usuario hace clic en el botón simplemente mover el foco a RelativeLayout usando requestFocus () llamar a RelativeLayout.
  5. Cuando el usuario teclea en EditText, el teclado aparece. Puedo introducir texto en eso.

Lo que quiero lograr

  1. Si cambio la orientación del teléfono cuando el teclado está visible, después de los cambios de orientación, el teclado debe permanecer.
  2. Si el teclado es visible y alguna otra actividad viene en la parte superior de la misma, por ejemplo, la alarma, las cabezas de chat de facebook, la apertura de algo desde el área de notificación, bloqueo de desbloqueo del dispositivo, etc.

Cómo estoy logrando esto

  1. En onSaveInstanceState (), compruebo si el foco está en EditText y luego poner una variable booleana en Bundle.
  2. En onStop (), estoy estableciendo una bandera booleana wasEditing = true .
  3. En onRestoreInstanceState (), comprobé si Bundle tiene el valor de flag establecido en onSaveInstanceState (). Si es así entonces soy make wasEditing = true .
  4. En onResume (), compruebo este wasEditing y si es cierto, solicito enfoque para EditText.
  5. Después de eso llamo imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT,resultRec)

Donde estoy consiguiendo el problema
A veces, después de ejecutar esta llamada, el teclado no es visible en pocos casos, como durante el cambio de orientación.
Cuando puse registros he encontrado esta función está devolviendo false
Pero si hago esta llamada de showSoftInput() con un cierto retardo de mEditText.postDelayed() usando mEditText.postDelayed() en onResume() todo trabaja muy bien.

Pregunta ¿En qué casos esta función devuelve false y por qué demora está funcionando?

Nota Aunque he resuelto mi problema con el retraso, pero todavía quiero saber por qué se está comportando así.

Este es un problema con el que me encontré hoy también. De mis 8 dispositivos Android sólo 1 tiene el problema y se está ejecutando Android 4.0.4.

El problema se solucionó añadiendo

 mEditText.requestFocus(); mEditText.requestFocusFromTouch(); 

Antes de llamar a mEditText.showSoftInput (…)

Verá que el resultcode de showSoftInput de showSoftInput es ahora true . Me di cuenta de que después de la mEditText.requestFocus() el isFocused() sigue siendo false . Probablemente un error en Android 4.0 y tal vez 4.1.

  • El teclado suave de Android oculta el botón
  • Cómo agregar "Siguiente" en el teclado android
  • Comience un teclado diferente para diferentes actividades
  • Evitar que el teclado suave se deseche
  • En Android, ¿Se puede interceptar eventos clave a nivel mundial antes de que lleguen al niño?
  • Android: ListView no se desplaza con el teclado
  • Android: maneja eventos de teclado virtual y físico
  • No puedo eliminar el IME japonés de mi emulador de Android
  • ¿Cómo hablar con un teclado Bluetooth?
  • ¿Cómo cambiar el color de fondo de la tecla para el teclado suave android?
  • Ocultar teclado suave después del diálogo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.