Android中有没有一种方法可以检测屏幕上是否显示软件(也称为“软”)键盘?
没有直接方法-请参阅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?。
因此,在长时间使用AccessibilityServices,窗口插图,屏幕高度检测等之后,我想我找到了一种方法。
如果您需要检查键盘状态,这应该可以工作:
我通过如下设置GlobalLayoutListener来做到这一点:
尝试此代码,如果显示了KeyboardShown,则此函数真正起作用,然后此函数返回真值...。
就我而言,我在布局中只需要管理一个EditText
,因此我提出了this解决方案。它运作良好,基本上是一个自定义EditText
,如果焦点发生更改或按下了后退/完成按钮,它会监听焦点并发送本地广播。要工作,您需要在布局中使用View
和android:focusable="true"
放置一个虚拟android:focusableInTouchMode="true"
,因为调用clearFocus()
时,焦点将重新分配给第一个可聚焦视图。虚拟视图的示例:
在Android中,您可以通过ADB Shell进行检测。我编写并使用了这种方法:
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();
}
}
});
@ iWantScala的答案很好,但不适用于我rootView.getRootView().getHeight()
始终具有相同的值
我有类似的问题。我需要对屏幕上的Enter按钮(隐藏键盘)做出反应。在这种情况下,您可以订阅打开了键盘的文本视图的OnEditorAction-如果您有多个可编辑框,请订阅所有这些。
有一种直接的方法可以找到答案。而且,它不需要更改布局。因此,它也可以在沉浸式全屏模式下工作。但是,不幸的是,它不适用于所有设备。因此,您必须使用您的设备进行测试。诀窍是您尝试隐藏或显示软键盘并捕获该尝试的结果。如果工作正常,则说明键盘没有真正显示或隐藏。我们只是要求状态。要保持最新状态,您只需重复此操作即可,例如每200毫秒,使用一个处理程序。下面的实现仅进行一次检查。如果进行多次检查,则应启用所有(_keyboardVisible)测试。
这对我有用。也许这永远是最好的方法对于所有版本
这里是一种解决方法,可了解软键盘是否可见。
您可能知道,只有在可能发生键入事件时,才能看到android软件键盘。换句话说,只有在聚焦EditText时,键盘才可见。这意味着您可以通过使用OnFocusChangeListener
我将答案转换为Kotlin,希望这对Kotlin用户有所帮助。
我写了sample。
现在终于有了从基于Kotlin的Android R开始的直接方法。
如果您在应用中支持AndroidR的api,则可以使用以下方法。
它与adjustNothing活动和生命周期事件的标志一起使用。同样在Kotlin中:
我这样做是,但是只有当您的目标是关闭/打开键盘时,它才会重新显示。
a可能正在使用:
尝试一下:
我创建了一个可用于此目的的简单类:https://github.com/ravindu1024/android-keyboardlistener。只需将其复制到您的项目中并使用,如下所示:
您可以使用showSoftInput()和hideSoftInput()的回调结果来检查键盘的状态。完整的细节和示例代码在
对于我所需的要求,这要简单得多。希望这会有所帮助: