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 }

31voto

Pankaj Kumar Punkte 80763

Wow, wir haben gute Nachrichten Android Geeks. Und es ist Zeit, sich von der alten Methode zu verabschieden. Zuerst werde ich hinzufügen offizielle Freigabemitteilung zu lesen und mehr über diese Methoden/Klassen zu erfahren, und dann werden wir sehen diese erstaunlichen Methoden / Klassen

Breaking Note: Fügen Sie diese nicht in Ihre Anwendungen ein, bis diese Klassen/Methoden freigegeben sind.

So überprüfen Sie die Sichtbarkeit der Tastatur

val insets = ViewCompat.getRootWindowInsets(view)
val isKeyboardVisible = insets.isVisible(Type.ime())

Wenige andere Dienstprogramme

Wie man die Höhe der Tastatur ermittelt

val insets = ViewCompat.getRootWindowInsets(view)
val keyboardHeight = insets.getInsets(Type.ime()).bottom

Einblenden/Ausblenden der Tastatur

val controller = view.windowInsetsController

// Show the keyboard
controller.show(Type.ime())

// Hide the keyboard
controller.hide(Type.ime())

Nota: WindowInsetsController in API-30 hinzugefügt, also warten, bis abwärtskompatible Klasse nicht verfügbar ist.

Wie man auf das Ereignis "Tastatur ausblenden/anzeigen" hört

ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets ->
    val isKeyboardVisible = insets.isVisible(Type.ime())
    if (isKeyboardVisible) {
        // Do it when keyboard is being shown
    } else {
        // Do it when keyboard is hidden
    }

    // Return the insets to keep going down this event to the view hierarchy
    insets
}

3 Stimmen

Ich habe ein Problem, es sagt: "Unresolved Referenz isVisible()", bitte helfen

0 Stimmen

0 Stimmen

Ver medium.com/androiddevelopers/ und erstaunliche Post für weitere Details

8voto

George Maisuradze Punkte 1844

Wenn Sie Ihre Tastatur ausblenden und gleichzeitig den Status der Softeingabe überprüfen müssen, sollten Sie die folgende Lösung verwenden:

public boolean hideSoftInput() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
    return imm.hideSoftInputFromWindow(mViewPager.getWindowToken(), 0);
}

Diese Methode gibt true zurück, wenn die Tastatur vor dem Ausblenden angezeigt wurde.

0 Stimmen

Dies ist die eine funktioniert ohne Höhe und alle... Danke... u sparte meine Zeit...

0 Stimmen

Dies sollte die akzeptierte Antwort sein. All diese Schreiberlinge... smh. Die API sagt nicht, was der Boolesche Wert ist, ist dies also eine sichere Methode?

0 Stimmen

Sie können einen ResultReceiver an hideSoftInptFromWindow übergeben, der Ihnen eine explizite Antwort gibt

7voto

Janus Kamp Hansen Punkte 127

Ich habe ein wenig Zeit gebraucht, um das herauszufinden... Ich lief es einige CastExceptions, aber herausgefunden, dass Sie Sie LinearLayout in der layout.xml mit dem Namen der Klasse ersetzen können.

Zum Beispiel so:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/llMaster">

<com.ourshoppingnote.RelativeLayoutThatDetectsSoftKeyboard android:background="@drawable/metal_background"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:id="@+id/rlMaster" >
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="1dip" android:background="@drawable/line"></LinearLayout>

          ....

</com.ourshoppingnote.RelativeLayoutThatDetectsSoftKeyboard>    

</LinearLayout>

Auf diese Weise werden Sie keine Probleme mit dem Guss haben.

... und wenn Sie das nicht auf jeder Seite machen wollen, empfehle ich Ihnen, "MasterPage in Android" zu verwenden. Siehe den Link hier: http://jnastase.alner.net/archive/2011/01/08/ldquomaster-pagesrdquo-in-Android.aspx

0 Stimmen

Seien Sie vorsichtig beim Einfügen in Ihr XML, wenn Sie nicht denselben Paket-/Klassennamen haben. Eclipse friert einfach ein und man muss es herunterfahren. So ein professionelles Produkt. /s

5 Stimmen

@SpencerRuport, deshalb ist es ja kostenlos.

0 Stimmen

@DoctorOreo - holen Sie sich IntelliJ. Es ist kostenlos und nicht ätzend.

6voto

Roger Keays Punkte 2991

Die Überprüfung der Höhe der Elemente ist nicht zuverlässig, da einige Tastaturen wie WifiKeyboard keine Höhe haben.

Stattdessen können Sie das Callback-Ergebnis von showSoftInput() und hideSoftInput() verwenden, um den Status der Tastatur zu überprüfen. Vollständige Details und Beispielcode unter

https://rogerkeays.com/how-to-check-if-the-software-keyboard-is-shown-in-Android

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.

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