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

2024-01-12

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

是否可以?

Thanks!


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 预览版 https://developer.android.com/preview/features#ime-transitions以及相应的文档 https://developer.android.com/reference/kotlin/android/view/View#setWindowInsetsAnimationCallback(android.view.WindowInsetsAnimation.Callback)

Android 11 之前

然而,这项工作尚未在Compat版本,所以你需要求助于黑客。

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

这是这个问题的一个很好的答案https://stackoverflow.com/a/36259261/372076 https://stackoverflow.com/a/36259261/372076。另外,这里的页面提供了一些不同的方法来实现 Android 11 之前的版本:

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


Note

该解决方案不适用于软键盘和onConfigurationChanged不会被调用为软(虚拟) 键盘。


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

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

Sample:

// 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();
    }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中如何捕获“虚拟键盘显示/隐藏”事件? 的相关文章

随机推荐

  • 抑制 GCC 警告“#include 指令末尾有额外标记”

    我正在用 C 编写一个程序 旨在在 HP NonStop 机器上编译和运行 然而 我想在运行 Linux 的工作站上进行主要开发 HP NonStop C 编译器需要非标准 include 指令 如下所示 include
  • 当标题有多个元素时如何在 zeep 中设置肥皂标题

    我正在尝试使用 python zeep 连接到肥皂服务 使用 wsdl 以下是soap ui 为操作生成的XML 然而我发现它很难确定如何设置肥皂头 在这种情况下 我们有标头中的多个 XML 元素
  • 如何在调用发送函数后获得 Laravel Mail 响应?

    Mail to 调用的方法之后是否可以在 Laravel 中获得 Mail 响应 哪里是最好的地方 Mail to order gt email gt send new ThankYouMail order gt fresh 我使用 Sen
  • 合并列表,同时覆盖 R 中同名的值

    我有两个带有命名元素的列表 a lt list a 1 b 2 b lt list b 3 c 4 我想组合这些列表 以便 a 中具有相同名称的任何元素都将被列表 b 覆盖 所以我得到了这个 list a 1 b 3 c 4 我知道我可以在
  • 如何验证提交的 ActiveRecord 的单个属性而不是其所有属性?

    我正在使用 Ruby on Rails 3 我想验证提交的 ActiveRecord 的单个属性而不是其所有属性 例如 在我的模型中 我有 validates firstname presence gt true validates las
  • 按多对多数据透视表列对 Laravel 集合进行排序

    我正在考虑显示一个列表assets 属于product按照定义的顺序order column在数据透视表上product asset 在这种情况下 sortBy https laravel com docs 5 6 collections
  • JavaScript 使用四舍五入到最接近的 10 [重复]

    这个问题在这里已经有答案了 我想使用 JavaScript 对整数进行舍入 例如 10 10 11 20 19 20 24 30 25 30 29 30 这应该可以做到 Math ceil N 10 10 其中 N 是您的数字之一
  • 禁用方向改变

    重新启动定制Camera 同时进行更改预览模式 from 风景转肖像 or 纵向转横向 我的 Surface 类代码如下所示 PreviewSurface java public class PreviewSurface extends S
  • 如何防止 Grails 中的作业并发执行?

    我在 grails 中有一个quartz 作业 需要每 5 秒执行一次 但我需要按顺序执行 在某些情况下 作业的执行时间超过了 5 秒 在这种情况下 我不想在上一个执行尚未完成时执行作业 如何在 grails 中配置它 当然 整个魔法可以通
  • EodData wsdl java 连接

    我一直在尝试弄清楚如何启动与 EodData com 的 WSDL 连接 wsdl地址是 http ws eoddata com data asmx wsdl 我正在使用 CXF 创建客户端连接 QName qname new QName
  • 绘制桑基图数据格式

    plotly 库有一些不错的桑基图https plotly com python sankey diagram https plotly com python sankey diagram 但数据要求您传递源 目标对的索引 link dic
  • ActionBarSherlock 实现中的 HoloEverywhere 错误

    导入后Sherlock成功了 我正在实施HoloEverywhere 我面临的唯一问题如下图所示 android support v4 app编译错误和pom xml也有错误 These errors are showing up even
  • 在哪里可以下载真正的 MonoDevelop Windows 二进制文件?

    monodevelop com 网站只是将我带到了 Xamarin Studio 这个东西 它对免费版本的使用有严格的限制 而且定价几乎与付费版本的 Visual Studio 一样糟糕 Windows 版 MonoDevelop 已经死了
  • 未找到规则“re​​act-hooks/exhaustive-deps”的定义

    添加后出现以下 eslint 错误 eslint disable next line react hooks exhaustive deps在我的代码中 8 14 错误 未找到规则 re act hooks exhaustive deps
  • Visual Studio Code - Xdebug 无法工作

    在 Visual Studio Code 1 9 1 mac 中我已经设置了php 调试插入 在调试屏幕中我开始 监听 Xdebug 之后 我在我的 XAMPP 服务器 本地 上打开 index php 但什么也没发生 屏幕底部的蓝色条变成
  • 从VS2008升级到2010后,Crystal Reports工具栏消失了

    我在 VS 2010 中将我们的网站转换为 asp net 4 0 Crystal reports 版本 10 5 3700 0 呈现报表 但工具栏不会显示 因此打印 更改页面功能消失了 我已经设定AspCompat true 在托管查看器
  • 汇编指令如何转化为CPU上的电压变化?

    过去 3 5 年我一直从事 C 和 CPython 工作 考虑一下我的知识基础 如果我要使用汇编指令 例如MOV AL 61h对于支持它的处理器 解释该代码并将其作为电压信号调度的处理器内部到底是什么 如此简单的指令如何执行 当我尝试思考其
  • 是否有 GSP(通用 SQL 解析器)的替代品?

    通用 SQL 解析器 http sqlparser com GSP 是一个功能相当丰富的 SQL 解析器 就我使用过的程度而言 它允许通过更改解析树本身以稳健的方式修改 SQL 语句 此外 它还支持大多数流行数据库的 SQL 风格 然而 G
  • 实体框架不保存所有更改

    我差点就落泪了 我有一个用户对象 该对象有几个属性 FirstName LastName 等 都是简单类型 字符串整型等 这些都可以很好地加载和更新 public class Jobwalker Key public Int64 ID ge
  • Android中如何捕获“虚拟键盘显示/隐藏”事件?

    我想根据是否显示虚拟键盘来更改布局 我搜索了 API 和各种博客 但似乎找不到任何有用的东西 是否可以 Thanks 2020年更新 现在这是可能的 在 Android 11 上 您可以执行以下操作 view setWindowInsets