2011-03-28 20 views
16

¿hay alguna manera de saber si el teclado se muestra en una actividad o no?¿Hay alguna manera de saber si se muestra el teclado virtual?

me trataron

InputMethodManager manager = (InputMethodManager) 
getSystemService(getApplicationContext().INPUT_METHOD_SERVICE); 
manager.isActive(v) 

pero isActive retornos falsos solamente antes de la primera vez que se muestra el teclado, pero si aparece el kb y luego despedidos, isActive rendimientos cierto también.

así que hay algún otro método para verificar este problema.

gracias

Respuesta

12

De acuerdo con esta POST

No se puede detectar si se muestra o no el teclado suave, pero se puede saber indirectamente que un tablero de tecla de función se muestra mediante el conocimiento de que el View de su actividad se cambia el tamaño.

Imagine que tiene un ListView y en la parte inferior un EditText, desea ir al final de la lista cuando se muestra un teclado virtual después de que el usuario hace clic en EditText.

es necesario implementar una subclase de ListView, a continuación, utilizarlo en su ListActivity o Activity o View.

public class ThreadView extends ListView { 

    public ThreadView(Context context, AttributeSet attributeSet) { 
     super(context, attributeSet); 
    } 

    @Override 
    protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) { 
     super.onSizeChanged(xNew, yNew, xOld, yOld); 

     if (yOld > yNew) { 
      setSelection(((ListAdapter) getAdapter()).getCount() - 1); 
     } 
    } 
} 

Esperanza esto ayuda

PS. "comprobar Cambios de configuración" solo funciona para el teclado de mano.

+0

Creo que esta es la única solución a este problema –

+1

Este es el camino a seguir, al menos en Android 2.2 y hasta la fecha. Es un verdadero dolor que no haya una API para detectar un teclado virtual (y para el caso, obtener un control sobre su animación de desplazamiento hacia arriba). ¡Gracias por la respuesta! –

+0

¿Por qué veo esto solo ahora? Pasé mucho tiempo intentando usar onMeasure, onLayoutChange, etc., y esta es la única solución que funcionó. ¡Lo más simple también! Muchas gracias, Doraemon, oh, digo, @DiveInto. : p – KarenAnne

-2

favor verifique cambios de configuración para su actividad

esto para su AndroidManifest.xml

y esto para su actividad clase http://developer.android.com/reference/android/app/Activity.html#onConfigurationChanged(android.content.res.Configuration)

Se hará necesidad de @Override the public method onConfigurationChanged (android.content.res.Configuration) de su actividad a ser capaz de manejar, por ejemplo, los siguientes valores:
hardKeyboardHidden,
teclado,
keyboardHidden

Para todos valores posibles check http://developer.android.com/reference/android/content/res/Configuration.html

Verás algo como esto:

HARDKEYBOARDHIDDEN_NO 
HARDKEYBOARDHIDDEN_UNDEFINED  
HARDKEYBOARDHIDDEN_YES 
KEYBOARDHIDDEN_NO 
KEYBOARDHIDDEN_UNDEFINED  
KEYBOARDHIDDEN_YES 
KEYBOARD_12KEY 
KEYBOARD_NOKEYS 
KEYBOARD_QWERTY 
KEYBOARD_UNDEFINED 

También hay usted será capaz de leer algo como esto:

public int hardKeyboardHidden // A flag indicating whether the hard keyboard 
           // has been hidden. 
public int keyboard The kind of keyboard attached to the device. 
public int keyboardHidden A flag indicating whether any keyboard is available. 

ACTUALIZACIÓN:

Aquí está un ejemplo específico de lo que estoy hablando:

http://developer.android.com/guide/topics/resources/runtime-changes.html

 
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 
     Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
    } 
    // Checks whether a hardware keyboard is available 
    if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) { 
     Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show(); 
    } else if (newConfig.hardKeyboardHidden == 
      Configuration.HARDKEYBOARDHIDDEN_YES) { 
     Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show(); 
    } 
} 
+1

Gracias por la respuesta, pero no capturó ningún cambio cuando el kb apareció o desapareció –

+0

Hola, usted debe buscar y ejemplo para ver que cuando en su manifiesto configura androide: configChanges = "keyboardHidden" Esto desencadenará el método onConfigurationChanged en cualquier actividad que llame. Si anula el método, puede pasar nuevos valores para su actividad o puede obtener los actuales. Quiero decir, que al usar esto puedes hacer que tu aplicación escuche eventos como cambios en la visibilidad del teclado y los maneje dentro de tu Actividad. – yeradis

+0

Acabo de actualizar la respuesta para agregar una muestra procedente de http://developer.android.com/guide/topics/resources/runtime-changes.html verá que hay una mejor información sobre "Manejar la configuración para cambiarse a sí mismo" – yeradis

3

Puede detectar el estado Y las coordenadas del teclado del software, usando el comando de shell dumpsys.

Como dumpsys requiere permission.android.DUMP, que es un permiso de aplicación del sistema, tiene dos opciones: 1. utilizar un dispositivo rooteado para otorgar este permiso. 2. anule el problema usando adb como se describe en mi other answer.

Ahora, ejecute el siguiente comando: dumpsys window InputMethod | grep "mHasSurface" para obtener los datos que está buscando.

-1

Esta es mi idea. No está probado.

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 

     // Checks whether a keyboard is available which is not hard keyboard 
     if ((newConfig.keyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO)&&(newConfig.keyboardHidden != Configuration.HARDKEYBOARDHIDDEN_NO)) { 
      Toast.makeText(this, "soft keyboard visible", Toast.LENGTH_SHORT).show(); 
     } else if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_YES) { 
     Toast.makeText(this, "soft keyboard hidden", Toast.LENGTH_SHORT).show(); 
     } 
    } 
+0

Si tiene una nueva pregunta, hágalo haciendo clic en el botón [Ask Question] (https://stackoverflow.com/questions/ask). Incluye un enlace a esta pregunta si ayuda a proporcionar contexto. - [De la crítica] (/ review/low-quality-posts/17931905) –

Cuestiones relacionadas