¿Hay alguna manera en Android de detectar si el teclado del software (también conocido como "soft") es visible en la pantalla?
android
keyboard
android-softkeyboard
andreea
fuente
fuente
Respuestas:
No hay una forma directa: consulte http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a donde ha respondido Dianne Hackborn del equipo de Android. Sin embargo, puede detectarlo indirectamente verificando si el tamaño de la ventana cambió en #onMeasure. Consulte ¿Cómo verificar la visibilidad del teclado de software en Android? .
fuente
Esto funciona para mi. Quizás esta sea siempre la mejor manera para todas las versiones .
Sería efectivo hacer una propiedad de visibilidad del teclado y observar estos cambios retrasados porque el método onGlobalLayout llama muchas veces. También es bueno verificar la rotación del dispositivo y
windowSoftInputMode
no lo esadjustNothing
.fuente
contentView
declara?prueba esto:
fuente
Creé una clase simple que se puede usar para esto: https://github.com/ravindu1024/android-keyboardlistener . Simplemente cópielo en su proyecto y úselo de la siguiente manera:
fuente
Muy fácil
1. Ponga la identificación en su vista raíz
rootView
es solo una vista que apunta a mi vista raíz en este caso arelative layout
:2. Inicialice su vista raíz en su Actividad:
RelativeLayout rootView = (RelativeLayout) findViewById(R.id.addresses_confirm_root_view);
3. Detecta si el teclado se abre o cierra usando
getViewTreeObserver()
fuente
1
. No importa. Solo esto debe ser menor que la longitud real del tecladoUsé esto como base: http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
Luego escribió este método:
Luego puede usar esto para probar todos los campos (EditText, AutoCompleteTextView, etc.) que pueden haber abierto un teclado virtual:
Además, no es una solución ideal, pero hace el trabajo.
fuente
Puede usar el resultado de devolución de llamada de showSoftInput () y hideSoftInput () para verificar el estado del teclado. Detalles completos y código de ejemplo en
http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
fuente
Puede consultar esta respuesta: https://stackoverflow.com/a/24105062/3629912
A mí me funcionó siempre.
Volverá verdadero, si el teclado del software es visible.
fuente
Entonces, después de mucho tiempo jugando con AccessibilityServices, ventanas insertadas, detección de altura de pantalla, etc., creo que encontré una manera de hacer esto.
Descargo de responsabilidad: utiliza un método oculto en Android, lo que significa que podría no ser coherente. Sin embargo, en mis pruebas, parece funcionar.
El método es InputMethodManager # getInputMethodWindowVisibleHeight () , y existe desde Lollipop (5.0).
Llamada que devuelve la altura, en píxeles, del teclado actual. En teoría, un teclado no debería tener 0 píxeles de altura, así que hice una simple verificación de altura (en Kotlin):
Uso Android Hidden API para evitar la reflexión cuando llamo a métodos ocultos (lo hago mucho para las aplicaciones que desarrollo, que en su mayoría son aplicaciones hacky / tuner), pero esto también debería ser posible con la reflexión:
fuente
Esto fue mucho menos complicado para los requisitos que necesitaba. Espero que esto pueda ayudar:
En la actividad principal:
El valor booleano primitivo predeterminado para mKeyboardStatus se inicializará en falso .
Luego verifique el valor de la siguiente manera y realice una acción si es necesario:
fuente
Esto debería funcionar si necesita verificar el estado del teclado:
Donde
UiUtils.KEYBOARD_VISIBLE_THRESHOLD_DP
= 100 y dip () es una función anko que convierte dpToPx:fuente
Hice esto configurando un GlobalLayoutListener, de la siguiente manera:
fuente
Pruebe este código que realmente funciona si KeyboardShown se muestra, entonces esta función devuelve un valor verdadero ...
fuente
En mi caso, solo tenía uno
EditText
para administrar en mi diseño, así que encontré esta solución. Funciona bien, básicamente es una costumbreEditText
que escucha el foco y envía una transmisión local si el foco cambia o si se presiona el botón Atrás / Listo. Para trabajar, debe colocar un ficticioView
en su diseño conandroid:focusable="true"
yandroid:focusableInTouchMode="true"
porque cuando llameclearFocus()
al foco se reasignará a la primera vista enfocable. Ejemplo de vista ficticia:Informaciones adicionales
La solución que detecta la diferencia en los cambios de diseño no funciona muy bien porque depende en gran medida de la densidad de la pantalla, ya que 100 px puede ser mucho en cierto dispositivo y nada en otros puede obtener falsos positivos. También diferentes proveedores tienen diferentes teclados.
fuente
En Android puedes detectar a través de ADB shell. Escribí y uso este método:
fuente
fuente
La respuesta de @iWantScala es genial, pero no funciona para mí
rootView.getRootView().getHeight()
siempre tiene el mismo valoruna forma es definir dos vars
agregar oyente global
Entonces revisa
funciona bien
fuente
Finalmente, ahora hay una forma directa a partir de Android R basada en Kotlin.
fuente
Tuve un problema similar. Necesitaba reaccionar al botón Enter en la pantalla (que ocultaba el teclado). En este caso, puede suscribirse a OnEditorAction de la vista de texto con la que se abrió el teclado; si tiene varios cuadros editables, suscríbase a todos ellos.
En su Actividad, usted tiene el control total del teclado, por lo que en ningún momento enfrentará el problema de si el teclado está abierto o no, si escucha todos los eventos de apertura y cierre.
fuente
Hay un método directo para descubrir esto. Y, no requiere los cambios de diseño.
Por lo tanto, también funciona en modo inmersivo a pantalla completa.
Pero, desafortunadamente, no funciona en todos los dispositivos. Por lo tanto, debe probarlo con su (s) dispositivo (s).
El truco es que intentas ocultar o mostrar el teclado virtual y capturar el resultado de ese intento.
Si funciona correctamente, entonces el teclado no se muestra ni se oculta realmente. Solo pedimos el estado.
Para mantenerse actualizado, simplemente repita esta operación, por ejemplo, cada 200 milisegundos, utilizando un controlador.
La implementación a continuación hace solo una comprobación.
Si realiza varias comprobaciones, debe habilitar todas las pruebas (_keyboardVisible).
fuente
Aquí hay una solución para saber si el softkeyboard es visible.
Algunos de los teclados populares tienen ciertas palabras clave en sus nombres de clase:
Desde ActivityManager.RunningServiceInfo, verifique los patrones anteriores en ClassNames. Además, ActivityManager.RunningServiceInfo's clientPackage = android, que indica que el teclado está vinculado al sistema.
La información mencionada anteriormente podría combinarse para una forma estricta de averiguar si el teclado virtual es visible.
fuente
Como sabrás, el teclado del software de Android será visible solo cuando haya un posible evento de tipeo. En otras palabras, el teclado solo es visible cuando EditText está enfocado. eso significa que puede obtener información sobre si el teclado está visible o no utilizando OnFocusChangeListener .
Ahora puede usar la variable isKeyBoardVisible en cualquier lugar de la clase para determinar si el teclado está Abierto o No. Funciono bien para mi.
Nota: Este proceso no funciona cuando el teclado se abre mediante programación usando InputMethodManager porque eso no invoca OnFocusChangeListener.
fuente
Convertí la respuesta al kotlin, espero que esto ayude a los usuarios de kotlin.
fuente
Funciona con el ajuste No se utiliza ningún indicador de actividad y eventos de ciclo de vida. También con Kotlin:
Método útil para mantener la vista siempre encima del teclado.
Donde getFullViewBounds
Donde getFullScreenSize
Donde updateMargin
fuente
Hice esto de la siguiente manera, pero es relevante solo si su objetivo es cerrar / abrir el teclado.
ejemplo cercano: (comprobando si el teclado ya está cerrado, si no, cerrando)
fuente
a puede estar usando:
fuente
Escribí muestra .
Este repositorio puede ayudar a detectar el estado del teclado sin suponer que "el teclado debe ser más de X parte de la pantalla"
fuente
Si admite apis para AndroidR en su aplicación, puede usar el siguiente método.
Nota: Esto solo está disponible para AndroidR y la versión de Android a continuación debe seguir alguna otra respuesta o la actualizaré para eso.
fuente