559 Stimmen

Wie kann man die Sichtbarkeit der Software-Tastatur in Android überprüfen?

Ich muss etwas ganz Einfaches tun - herausfinden, ob die Software-Tastatur angezeigt wird. Ist dies in Android möglich?

9 Stimmen

Obwohl die Antwort von Reuben Scratton gut ist, scheint sie auf einem Tablet nicht zu funktionieren. Ich habe die Prüfung diff>128 durch diff>screenHeight/3 ersetzt.

2 Stimmen

Die Antwort von Reuben Scratton war gut, aber ich brauchte die Anpassung von KaChi, um sie wirklich nutzen zu können.

0 Stimmen

Anstatt nur den Höhenunterschied zu prüfen, können wir Folgendes tun View v = this.getCurrentFocus();if (diff>100 && v != null){ // Its keyboard } else { //Keyboard hidden }

2voto

John smith Punkte 1751

Ich denke, diese Methode wird Ihnen helfen, herauszufinden, ob die Tastatur sichtbar ist oder nicht.

 public Boolean isSoftKeyBoardVisible(){
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    if (imm.isAcceptingText()) {
        Log.d(TAG,"Software Keyboard was shown");
        return true;
    } else {
        Log.d(TAG,"Software Keyboard was not shown");
        return false;
    }

}

1 Stimmen

Antwortet immer, was sichtbar ist

2voto

Rahul Mandaliya Punkte 728

Machen Sie keinen harten Code. Der beste Weg ist, müssen Sie Ihre Ansichten, während auf Get Focus on EditText mit KeyBord Show Größe ändern. Sie können dies tun, indem Sie die Eigenschaft resize für die Aktivität in der Manifestdatei mit dem unten stehenden Code hinzufügen.

android:windowSoftInputMode="adjustResize"

0 Stimmen

Überraschenderweise funktioniert das wirklich! Ich hatte es auf "adjustPan" eingestellt, was aber nichts gebracht hat :)

2voto

billylindeman Punkte 21

Meine Antwort ist im Grunde die gleiche wie die von Kachi, aber ich habe sie in eine nette Helper-Klasse verpackt, um die Art und Weise, wie sie in meiner App verwendet wird, zu bereinigen.

import android.app.Activity;
import android.app.Fragment;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;

/**
 * Detects Keyboard Status changes and fires events only once for each change
 */
public class KeyboardStatusDetector {
    KeyboardVisibilityListener visibilityListener;

    boolean keyboardVisible = false;

    public void registerFragment(Fragment f) {
        registerView(f.getView());
    }

    public void registerActivity(Activity a) {
        registerView(a.getWindow().getDecorView().findViewById(android.R.id.content));
    }

    public KeyboardStatusDetector registerView(final View v) {
        v.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                v.getWindowVisibleDisplayFrame(r);

                int heightDiff = v.getRootView().getHeight() - (r.bottom - r.top);
                if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                    /** Check this variable to debounce layout events */
                    if(!keyboardVisible) {
                        keyboardVisible = true;
                        if(visibilityListener != null) visibilityListener.onVisibilityChanged(true);
                    }
                } else {
                    if(keyboardVisible) {
                        keyboardVisible = false;
                        if(visibilityListener != null) visibilityListener.onVisibilityChanged(false);
                    }
                }
            }
        });

        return this;
    }

    public KeyboardStatusDetector setVisibilityListener(KeyboardVisibilityListener listener) {
        visibilityListener = listener;
        return this;
    }

    public static interface KeyboardVisibilityListener {
        public void onVisibilityChanged(boolean keyboardVisible);
    }
}

Auf diese Weise können Sie überall in der App Tastaturänderungen erkennen:

    new KeyboardStatusDetector()
            .registerFragment(fragment)  //register to a fragment 
            .registerActivity(activity)  //or register to an activity
            .registerView(view)          //or register to a view
            .setVisibilityListener(new KeyboardVisibilityListener() {
                @Override
                public void onVisibilityChanged(boolean keyboardVisible) {
                    if(keyboardVisible) {
                       //Do stuff for keyboard visible
                    }else {
                       //Do stuff for keyboard hidden
                    }
                }
            });

Hinweis: Verwenden Sie nur einen der "Register"-Aufrufe. Sie funktionieren alle gleich und sind nur der Einfachheit halber vorhanden

2voto

Quantum Dot Punkte 395

Ich hatte Schwierigkeiten, den Tastaturstatus beizubehalten, wenn ich die Ausrichtung von Fragmenten innerhalb eines Viewpagers änderte. Ich bin nicht sicher, warum, aber es scheint nur zu sein, wonky und verhält sich anders als eine Standard-Aktivität.

Um den Tastaturstatus in diesem Fall zu erhalten, sollten Sie zunächst android:windowSoftInputMode = "stateUnchanged" zu Ihrem AndroidManifest.xml . Sie werden jedoch feststellen, dass dies nicht das gesamte Problem löst - die Tastatur öffnete sich für mich nicht, wenn sie bereits vor der Ausrichtungsänderung geöffnet war. In allen anderen Fällen schien das Verhalten korrekt zu sein.

Dann müssen wir eine der hier genannten Lösungen umsetzen. Die sauberste, die ich gefunden habe, war die von George Maisuradze - verwenden Sie den booleschen Callback von hideSoftInputFromWindow:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
return imm.hideSoftInputFromWindow(mViewPager.getWindowToken(), 0);

Ich habe diesen Wert in meinem Fragment in der onSaveInstanceState Methode und rief sie ab onCreate . Dann zeigte ich gewaltsam die Tastatur in onCreateView wenn es einen Wert von true (es wird true zurückgegeben, wenn die Tastatur sichtbar ist, bevor sie vor der Zerstörung des Fragments tatsächlich versteckt wird).

2voto

IRvanFauziE Punkte 815

Sie können dies versuchen, es hat bei mir gut funktioniert:

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

if (imm.isAcceptingText()) {
    //Software Keyboard was shown..
} else {
    //Software Keyboard was not shown..
}

1 Stimmen

Verwenden Sie dies nicht, es gibt true zurück, wenn die Tastatur mit zurück ausgeblendet wurde, aber die Ansicht den Fokus hat, zumindest auf Marshmallow

2 Stimmen

Antwortet immer, was sichtbar ist

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X