如何在 Android 中捕获“虚拟键盘显示/隐藏”事件?

新手上路,请多包涵

我想根据是否显示虚拟键盘来更改布局。我搜索了 API 和各种博客,但似乎找不到任何有用的东西。

可能吗?

谢谢!

原文由 Sander Versluys 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 911
2 个回答

2020 更新

现在这是可能的:

在 Android 11 上,您可以执行

view.setWindowInsetsAnimationCallback(object : WindowInsetsAnimation.Callback {
    override fun onEnd(animation: WindowInsetsAnimation) {
        super.onEnd(animation)
        val showingKeyboard = view.rootWindowInsets.isVisible(WindowInsets.Type.ime())
        // now use the boolean for something
    }
})

您还可以收听显示/隐藏键盘的动画并进行相应的过渡。

我推荐阅读 Android 11 preview 和相应的 文档

安卓 11 之前

但是,这项工作尚未在 Compat 版本中提供,因此您需要求助于黑客。

您可以获得窗口插图,如果底部插图大于您认为相当好的某个值(通过实验),您可以认为这是显示键盘。这不是很好,在某些情况下可能会失败,但没有框架支持。

这是对这个确切问题 https://stackoverflow.com/a/36259261/372076 的一个很好的答案。或者,这里有一个页面提供了一些不同的方法来实现这个 pre Android 11:

https://developer.salesforce.com/docs/atlas.en-us.noversion.service_sdk_android.meta/service_sdk_android/android_detecting_keyboard.htm


笔记

此解决方案不适用于软键盘,并且不会为软(虚拟)键盘调用 onConfigurationChanged


您必须自己处理配置更改。

http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

样本:

 // from the link above
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);


    // Checks whether a hardware keyboard is available
    if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
        Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
    } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
        Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
    }
}

然后只需更改某些视图的可见性、更新字段并更改布局文件。

原文由 Pedro Loureiro 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题