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 }

4voto

nikis Punkte 10991

Es gibt auch eine Lösung mit Systemeinsätzen, aber sie funktioniert nur mit API >= 21 ( Android L ). Angenommen, Sie haben BottomNavigationView , das ein Kind von LinearLayout und Sie müssen es ausblenden, wenn die Tastatur angezeigt wird:

> LinearLayout
  > ContentView
  > BottomNavigationView

Alles, was Sie tun müssen, ist, die LinearLayout auf diese Art und Weise:

public class KeyboardAwareLinearLayout extends LinearLayout {
    public KeyboardAwareLinearLayout(Context context) {
        super(context);
    }

    public KeyboardAwareLinearLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public KeyboardAwareLinearLayout(Context context,
                                     @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public KeyboardAwareLinearLayout(Context context, AttributeSet attrs,
                                     int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public WindowInsets onApplyWindowInsets(WindowInsets insets) {
        int childCount = getChildCount();
        for (int index = 0; index < childCount; index++) {
            View view = getChildAt(index);
            if (view instanceof BottomNavigationView) {
                int bottom = insets.getSystemWindowInsetBottom();
                if (bottom >= ViewUtils.dpToPx(200)) {
                    // keyboard is shown
                    view.setVisibility(GONE);
                } else {
                    // keyboard is hidden
                    view.setVisibility(VISIBLE);
                }
            }
        }
        return insets;
    }
}

Die Idee ist, dass wenn die Tastatur angezeigt wird, die Systemeinsätze mit ziemlich großen .bottom Wert.

4voto

Kevin Du Punkte 41

Es gibt eine versteckte Methode, die dabei helfen kann, InputMethodManager.getInputMethodWindowVisibleHeight . Aber ich weiß nicht, warum es versteckt ist.

import android.content.Context
import android.os.Handler
import android.view.inputmethod.InputMethodManager

class SoftKeyboardStateWatcher(private val ctx: Context) {
  companion object {
    private const val DELAY = 10L
  }

  private val handler = Handler()
  private var isSoftKeyboardOpened: Boolean = false

  private val height: Int
    get() {
      val imm = ctx.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
      val method = imm.javaClass.getMethod("getInputMethodWindowVisibleHeight")
      method.isAccessible = true
      return method.invoke(imm) as Int
    }

  private val task: Runnable by lazy {
    Runnable {
      start()
      if (!isSoftKeyboardOpened && height > 0) {
        isSoftKeyboardOpened = true
        notifyOnSoftKeyboardOpened(height)
      } else if (isSoftKeyboardOpened && height == 0) {
        isSoftKeyboardOpened = false
        notifyOnSoftKeyboardClosed()
      }
    }
  }

  var listener: SoftKeyboardStateListener? = null

  interface SoftKeyboardStateListener {
    fun onSoftKeyboardOpened(keyboardHeightInPx: Int)
    fun onSoftKeyboardClosed()
  }

  fun start() {
    handler.postDelayed(task, DELAY)
  }

  fun stop() {
    handler.postDelayed({
      if (!isSoftKeyboardOpened) handler.removeCallbacks(task)
    }, DELAY * 10)
  }

  private fun notifyOnSoftKeyboardOpened(keyboardHeightInPx: Int) {
    listener?.onSoftKeyboardOpened(keyboardHeightInPx)
  }

  private fun notifyOnSoftKeyboardClosed() {
    listener?.onSoftKeyboardClosed()
  }
}

0 Stimmen

Wenn jemand dies benötigen würde - es funktioniert in Xamarin als auch, Name der Methode ist genau das gleiche und muss auf die gleiche Weise zugegriffen werden - durch die Class-Eigenschaft auf die InputMethodManager.

0 Stimmen

Seien Sie vorsichtig bei der Verwendung dieser, es ist nicht unterstützt API (es ist aus einem Grund versteckt) und für den Anfang es funktioniert nicht auf KitKat.

4voto

MGK Punkte 6940

Anstatt den Unterschied zu kodieren, habe ich etwas Ähnliches gemacht, da ich in meiner Anwendung keine Menüoptionen hatte.

final View root= findViewById(R.id.myrootview); 
root.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
    public void onGlobalLayout() {
        int heightDiff = root.getRootView().getHeight() - root.getHeight();

        Rect rectgle= new Rect();
        Window window= getWindow();
        window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
        int contentViewTop=                     
          window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
        if(heightDiff <= contentViewTop){
            //Soft KeyBoard Hidden
        }else{
            //Soft KeyBoard Shown
        }
     }
});

0 Stimmen

Es funktioniert nicht für Android:windowSoftInputMode="adjustPan". Ich wollte, dass mein Bildschirm nicht geschrumpft wird, wenn die weiche Tastatur erscheint. Können Sie bitte sagen, eine Lösung, so dass es funktioniert auch für adjustPan

3voto

Roselyn Soffer Punkte 31

Es ist zwar schon ewig her, was den Computer betrifft, aber diese Frage ist immer noch unglaublich aktuell! Also habe ich die obigen Antworten genommen und sie ein wenig kombiniert und verfeinert...

public interface OnKeyboardVisibilityListener {
    void onVisibilityChanged(boolean visible);
}

public final void setKeyboardListener(final OnKeyboardVisibilityListener listener) {
    final View activityRootView = ((ViewGroup) getActivity().findViewById(android.R.id.content)).getChildAt(0);
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        private boolean wasOpened;

    private final Rect r = new Rect();

        @Override
        public void onGlobalLayout() {
            activityRootView.getWindowVisibleDisplayFrame(r);

            int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
            boolean isOpen = heightDiff > 100;
            if (isOpen == wasOpened) {
                logDebug("Ignoring global layout change...");
                return;
            }

            wasOpened = isOpen;
            listener.onVisibilityChanged(isOpen);
        }
    });
}

Das funktioniert bei mir.

3voto

Jaydeep chatrola Punkte 1897

Laut dem Dokument.. https://developer.Android.com/reference/androidx/core/view/WindowInsetsCompat

Freigabemitteilung prüfen.. https://developer.Android.com/jetpack/androidx/releases/core#1.5.0-alpha02

Um die aktuelle Sichtbarkeit der Tastatur zu erhalten, können Sie getRootWindowInsets und rufen dann die isVisible() und übergibt dabei den IME-Typ.

val windowinsetscompat = ViewCompat.getRootWindowInsets(view)
val imeVisible = windowinsetscompat.isVisible(Type.ime())

es gibt auch einen Hörer für Änderungen OnApplyWindowInsetsListener

ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets ->
    val imeVisible = insets.isVisible(Type.ime())
}

0 Stimmen

WOHER KOMMT DIE METHODE "isVisible". Ich habe eine "ungelöste Referenz". Mein Gott, ich hasse Android und Google

0 Stimmen

@Andrew versuchen, die Implementierung 'androidx.core:core-ktx:1.5.0-alpha02' in build.gradle hinzuzufügen

0 Stimmen

Ich habe sie bereits gefunden, danke. Aber die gottverdammte Funktion funktioniert nicht... "OnApplyWindowInsets" wird nie aufgerufen... API 21

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