¿Cómo puedo detectar si el teclado del software está visible en el dispositivo Android o no?

Resuelto andreea asked hace 54 años • 38 respuestas

¿Hay alguna forma en Android de detectar si el teclado del software (también conocido como "software") está visible en la pantalla?

andreea avatar Jan 01 '70 08:01 andreea
Aceptado

Esto funciona para mí. Quizás esta sea siempre la mejor manera para todas las versiones .

Sería efectivo crear una propiedad de visibilidad del teclado y observar que estos cambios se retrasan porque el método onGlobalLayout llama muchas veces. También es bueno comprobar la rotación del dispositivo y windowSoftInputModeno lo es adjustNothing.

boolean isKeyboardShowing = false;
void onKeyboardVisibilityChanged(boolean opened) {
    print("keyboard " + opened);
}

// ContentView is the root view of the layout of this activity/fragment    
contentView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {

        Rect r = new Rect();
        contentView.getWindowVisibleDisplayFrame(r);
        int screenHeight = contentView.getRootView().getHeight();

        // r.bottom is the position above soft keypad or device button.
        // if keypad is shown, the r.bottom is smaller than that before.
        int keypadHeight = screenHeight - r.bottom;

        Log.d(TAG, "keypadHeight = " + keypadHeight);

        if (keypadHeight > screenHeight * 0.15) { // 0.15 ratio is perhaps enough to determine keypad height.
            // keyboard is opened
            if (!isKeyboardShowing) {
                isKeyboardShowing = true;
                onKeyboardVisibilityChanged(true);
            }
        }
        else {
            // keyboard is closed
            if (isKeyboardShowing) {
                isKeyboardShowing = false;
                onKeyboardVisibilityChanged(false);
            }
        }
    }
});
Brownsoo Han avatar Nov 17 '2014 01:11 Brownsoo Han

prueba esto:

InputMethodManager imm = (InputMethodManager) getActivity()
            .getSystemService(Context.INPUT_METHOD_SERVICE);

    if (imm.isAcceptingText()) {
        writeToLog("Software Keyboard was shown");
    } else {
        writeToLog("Software Keyboard was not shown");
    }
JoachimR avatar Sep 23 '2011 14:09 JoachimR

Creé una clase simple que se puede usar para esto: https://github.com/ravindu1024/android-keyboardlistener . Simplemente cópielo en su proyecto y utilícelo de la siguiente manera:

KeyboardUtils.addKeyboardToggleListener(this, new KeyboardUtils.SoftKeyboardToggleListener()
{
    @Override
    public void onToggleSoftKeyboard(boolean isVisible)
    {
        Log.d("keyboard", "keyboard visible: "+isVisible);
    }
});
ravindu1024 avatar Jul 15 '2016 02:07 ravindu1024

No hay una forma directa: consulte http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a donde respondió Dianne Hackborn del equipo de Android. Sin embargo, puede detectarlo indirectamente comprobando si el tamaño de la ventana cambió en #onMeasure. Consulte ¿Cómo comprobar la visibilidad del teclado del software en Android? .

user770428 avatar May 25 '2011 22:05 user770428