在 Android Activity 中从软件键盘监听 Webview 按键事件

2024-02-15

是否可以在 Android 主机应用程序中处理来自 Web 视图的软件键盘事件?

例如,我的应用程序的 Activity 是否可以侦听显示 Google 网站的 Web 视图的搜索字段中键入的内容?

考虑到下面描述的方法,如果我覆盖它返回 true,这是可能的,但不幸的是我无法做到这一点。有任何想法吗?

public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event)

Added in API level 1
Give the host application a chance to handle the key event synchronously. e.g. menu shortcut key     events need to be filtered this way. If return true, WebView will not handle the key event. If return false, WebView will always handle the key event, so none of the super in the view chain will see the key event. The default behavior returns false.

Parameters
view    The WebView that is initiating the callback.
event   The key event.
Returns
True if the host application wants to handle the key event itself, otherwise return false

我觉得shouldOverrideKeyEvent方法只是告诉系统哪个“窗口”应该收到关键事件的通知;这确实NOT将 WebView javascript 事件传递回 Activity。

如果您需要将信息从 WebView 传递到您的 Activity,您可以使用 JavascriptInterface。请注意,这只能在您控制的网站上进行;否则这将是一个安全漏洞,使您的应用程序可以访问敏感数据。

首先,创建一个类作为您的界面:

class MyJavaScriptInterface{
    //Methods to call via js in the WebView go here
}

然后初始化 WebView 上的界面:

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new MyJavaScriptInterface(), "JSInterface");

现在,您说要将输入的内容从文本字段传递回活动。为此,为模糊文本字段注册一个事件侦听器,该事件侦听器将在字段失去焦点时触发。

<!-- HTML element to listen for blur -->
<input id="field" type="text" />

<script>
  //Communicate with Javascript Interface
  var jsFieldBlur = function(field){
      //Only call if the interface exists
      if(window.JSInterface){
          window.JSInterface.onFieldBlur(field.id, field.value);
      }
  };

  //Obtain reference to DOM element
  var field = document.getElementById("field");

  //Attach blur listener
  field.addEventListener("blur", function( event ) {
      jsFieldBlur(event.target);   
  }, true);
</script>

最后,我们需要添加onFieldBlur方法到 MyJavascriptInterface 类,以便可以通过 javascript 调用它。以这种方式定义的任何方法都必须位于@JavascriptInterface以便对 WebView 可见。

class MyJavaScriptInterface{
    @JavascriptInterface
    public void onFieldBlur(String fieldId, String fieldValue){
        //Do something with value
        Toast.makeText(getContext(), fieldId+"="+fieldValue, Toast.LENGTH_LONG).show();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android Activity 中从软件键盘监听 Webview 按键事件 的相关文章

随机推荐

  • 有没有好的J2ME IDE? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 韩语、Mac/Windows 系统字体

    关于显示韩文字体 当我使用时我注意到arial 它默认为sans serif 这在 Mac 和 Windows 上当然是不同的 我很难在 互联网 上找到有关此的信息 我希望这里有人能够告诉我一个可以在 Mac 和 Windows 上运行的韩
  • 隐藏客户端点击的div

    试图让这个 div 消失 似乎没有做我期望的事情 我哪里出错了 它不会消失 JavaScript
  • 未考虑 Google 自定义搜索 imgSize 和 imgType

    当我进行自定义搜索时 它会按预期返回图像和格式化的 JSON 唯一没有预料到并且没有考虑到的就是参数 imgType 照片 图像尺寸 小 这对谷歌来说没有什么区别 我仍然收到剪贴画图像和非常大的图像 在某些情况下大于 2500 像素 有任何
  • 重置区域分配器,分配仍然有效

    在我的带有 MKMapView 的 ViewController 被取消初始化后 我在 XCode 10 2 1 中收到以下消息 内存 重置区域分配器 其中 24 个分配仍然有效 我在 ViewController 中使用以下代码来清理 M
  • 如何在expo React Native App中将api级别29更改为30

    当我将应用程序包上传到 Play 商店时出现此消息 您的应用程序当前面向 API 级别 29 并且必须至少面向 API 级别 30 以确保它基于针对安全性和性能进行优化的最新 API 构建 将应用程序的目标 API 级别更改为至少 30 如
  • 检测WinRT和Windows 8之间的差异

    对于统计跟踪 我希望能够判断应用程序是在 Windows RT 还是 Windows Pro 上运行 该线程表示无法获取系统版本信息 在 WinRT Metro 应用程序 C 中获取操作系统版本 https stackoverflow co
  • Python:嵌套循环

    考虑一下 gt gt gt a one two bad good gt gt gt for i in a for x in i print x one two bad good 我该如何编写这段代码 但使用如下语法 for i in a p
  • 如何更改 Visual Studio 2012、2013 或 2015 许可证密钥?

    我的机器上有一份 Visual Studio 2012 Pro 的副本 带有一个序列号 但我不再使用它 因为我必须使用另一个序列号 我的问题是我一直卸载 Visual Studio 但重新安装后注册信息仍然存在 并且我无法弄清楚我必须删除哪
  • 使用反射和枚举进行 MVC 应用程序访问的逻辑控制是否安全?

    Trying to manage access to a web site I created some necessary entities 目标是为我的 MVC 应用程序的某些控制器的操作方法使用自定义权限属性 Permissions
  • redis:备份dump.rdb

    Context 我有一个正在运行的 redis 服务器 我想做一个备份 Idea 我想做以下事情 cp dump rdb some other location 06 24 2012 rdb Concern 我没有看到任何东西向我承诺 du
  • 使用 ExecutorService 时出现 CancellationException

    我想等待两个任务完成然后返回它们的结果 但有时我会收到此错误 为什么 CancellationException从哪里来 public class ShouldVoteTask extends AbstractWorkerTask
  • python -m 用于预提交

    pip3 install pre commit gt 已安装 我都试过了python3 m pre commit version and pre commit version 它说找不到模块 我正在使用 Pycharm 并从 Github
  • Appium - 创建会话 - 错误:应提供 JSONWP 或 W3C 功能

    我无法让 Appium 启动 Android 会话 并且在网上搜索时没有找到与我收到的错误消息相关的任何内容 当我运行测试时 Appium 转储此日志 debug MJSONWP Calling AppiumDriver createSes
  • 用于在 Google 表格中进行多次查找和替换的 Google Apps 脚本

    关于 Stack Exchange 的第一个问题 希望它有意义 一些背景 我在学校环境中工作 并协助学习支持人员为某些学生创建更易读的时间表 他们从我们的网站复制时间表数据 其中包含科目代码 教师姓名和房间号 它的格式与您在下图中看到的格式
  • AngularJS 和怪异模式:IE8+ 上的空白屏幕

    我正在开发一个 Angular 项目 该项目将包含在我无法控制的 HTML 页面中 实际上我只能访问里面的内容元素 有许多限制并不容易处理 1 我无法更改文档类型 2 我无法删除此元标记 3 应用程序必须加载 XML 文件 我设法克服了第
  • 如何在 Eclipse-Helios JDT 中专门抑制“比较相同表达式”

    我尝试用注释封闭方法 SuppressWarnings compareIdentical 但这不起作用 更糟糕的是 注释会产生自己的结果 Unsupported SuppressWarnings compareIdentical 警告 我知
  • Xcode源代码控制查看历史修改文件失败

    I used Xcode要连接的源代码控制SVN服务器 查看源代码后 我执行了commit update 一切正常 但是当我点击源代码控制 gt 历史记录 然后单击 显示修改的文件 然后显示一个警报对话框 源代码管理操作失败 因为找不到工作
  • 如何与本机桌面 (win) 应用程序建立对等连接

    我需要与本机桌面 win 应用程序和网络浏览器建立对等连接 只是为了传输原始数据 从理论上讲 WebRTC 似乎是实现这一目标的唯一方法 如果您想使用 WebRTC 在浏览器和桌面之间交换数据 您可以使用此库将桌面部分编码为 C 语言 ht
  • 在 Android Activity 中从软件键盘监听 Webview 按键事件

    是否可以在 Android 主机应用程序中处理来自 Web 视图的软件键盘事件 例如 我的应用程序的 Activity 是否可以侦听显示 Google 网站的 Web 视图的搜索字段中键入的内容 考虑到下面描述的方法 如果我覆盖它返回 tr