如何检测软件键盘在Android设备上是否可见?

问题描述 投票:242回答:28

Android中有没有一种方法可以检测屏幕上是否显示软件(也称为“软”)键盘?

android keyboard android-softkeyboard
28个回答
70
投票

没有直接方法-请参阅http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a,Android团队的Dianne Hackborn回答了。但是,您可以通过检查#onMeasure中的窗口大小是否更改来间接检测到它。参见How to check visibility of software keyboard in Android?


4
投票

因此,在长时间使用AccessibilityServices,窗口插图,屏幕高度检测等之后,我想我找到了一种方法。


4
投票

如果您需要检查键盘状态,这应该可以工作:


3
投票

我通过如下设置GlobalLayoutListener来做到这一点:


2
投票

尝试此代码,如果显示了KeyboardShown,则此函数真正起作用,然后此函数返回真值...。


2
投票

就我而言,我在布局中只需要管理一个EditText,因此我提出了this解决方案。它运作良好,基本上是一个自定义EditText,如果焦点发生更改或按下了后退/完成按钮,它会监听焦点并发送本地广播。要工作,您需要在布局中使用Viewandroid:focusable="true"放置一个虚拟android:focusableInTouchMode="true",因为调用clearFocus()时,焦点将重新分配给第一个可聚焦视图。虚拟视图的示例:


1
投票

在Android中,您可以通过ADB Shell进行检测。我编写并使用了这种方法:


1
投票
final View activityRootView = findViewById(R.id.rootlayout);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            activityRootView.getWindowVisibleDisplayFrame(r);

            int screenHeight = activityRootView.getRootView().getHeight();
            Log.e("screenHeight", String.valueOf(screenHeight));
            int heightDiff = screenHeight - (r.bottom - r.top);
            Log.e("heightDiff", String.valueOf(heightDiff));
            boolean visible = heightDiff > screenHeight / 3;
            Log.e("visible", String.valueOf(visible));
            if (visible) {
                Toast.makeText(LabRegister.this, "I am here 1", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(LabRegister.this, "I am here 2", Toast.LENGTH_SHORT).show();
            }
        }
});

1
投票

@ iWantScala的答案很好,但不适用于我rootView.getRootView().getHeight()始终具有相同的值


0
投票

我有类似的问题。我需要对屏幕上的Enter按钮(隐藏键盘)做出反应。在这种情况下,您可以订阅打开了键盘的文本视图的OnEditorAction-如果您有多个可编辑框,请订阅所有这些。


0
投票

有一种直接的方法可以找到答案。而且,它不需要更改布局。因此,它也可以在沉浸式全屏模式下工作。但是,不幸的是,它不适用于所有设备。因此,您必须使用您的设备进行测试。诀窍是您尝试隐藏或显示软键盘并捕获该尝试的结果。如果工作正常,则说明键盘没有真正显示或隐藏。我们只是要求状态。要保持最新状态,您只需重复此操作即可,例如每200毫秒,使用一个处理程序。下面的实现仅进行一次检查。如果进行多次检查,则应启用所有(_keyboardVisible)测试。


269
投票

这对我有用。也许这永远是最好的方法对于所有版本


0
投票

这里是一种解决方法,可了解软键盘是否可见。


0
投票

您可能知道,只有在可能发生键入事件时,才能看到android软件键盘。换句话说,只有在聚焦EditText时,键盘才可见。这意味着您可以通过使用OnFocusChangeListener


0
投票

我将答案转换为Kotlin,希望这对Kotlin用户有所帮助。


0
投票

我写了sample


0
投票

现在终于有了从基于Kotlin的Android R开始的直接方法。


0
投票

如果您在应用中支持AndroidR的api,则可以使用以下方法。


0
投票

它与adjustNothing活动和生命周期事件的标志一起使用。同样在Kotlin中:


-1
投票

我这样做是,但是只有当您的目标是关闭/打开键盘时,它才会重新显示。


-1
投票

a可能正在使用:


70
投票

尝试一下:


56
投票

我创建了一个可用于此目的的简单类:https://github.com/ravindu1024/android-keyboardlistener。只需将其复制到您的项目中并使用,如下所示:


28
投票

非常容易



7
投票

您可以使用showSoftInput()和hideSoftInput()的回调结果来检查键盘的状态。完整的细节和示例代码在


6
投票

4
投票

对于我所需的要求,这要简单得多。希望这会有所帮助:

© www.soinside.com 2019 - 2024. All rights reserved.