android webview软键盘监听删除键、回车键、其他键

news/2024/10/18 1:30:53/

android webview软键盘监听删除键、回车键、其他键

终于有时间来写文章了,头一回发表,文章连贯性可能无法保障,大家勉强看一下吧

今天说点关于android 和 webview 沟通的时候,需要监听软键盘的按键事件的问题

情境描述:由于js在部分手机上(比如华为青春版P8)无法监听到删除键,引起项目部分功能无法实现

解决思路:js 与android 互相沟通 就不多说了,网上一搜一大片,重点说一下 我的解决办法,之前在网上搜了一下,说的是andriod跟webview交互的时候,就把输入法管理 权交给webview了,从自己的界面代码是没有办法去监听软键盘的,所以想到了,看能不能去拦截下 输入链接桥梁,然后再拦截事件转交给 js,这样那些js无法监听软键盘的事件就ok了,

 6.0手机以上 你可以采用像网上说的,自定义Webview,继承Webview,自定义里面的其他覆写方法不多说,网上一搜一大片,重点是复写onCreateInputConnection(EditorInfo outAttrs)方法,返回一个InputConnection输入法链接桥梁,然后对这个输入法链接桥梁 做一些你要干的事情,代码如下:

public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
   return new MyInputConnection(super.onCreateInputConnection(outAttrs),//用父类的输入链接桥梁 转换成自己的,以便于对输入事件拦截,         true,onItemClickCallBackI);  //onItemClickCallBackI是自定义的一个回调接口,没什么可说的 
}                 

public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
   return new MyInputConnection(super.onCreateInputConnection(outAttrs),//用父类的输入链接桥梁 转换成自己的,以便于对输入事件拦截,         true,onItemClickCallBackI);  //onItemClickCallBackI是自定义的一个回调接口,没什么可说的 

public class MyInputConnection extends InputConnectionWrapper {private OnItemClickCallBackI onItemClickCallBackI;
   public MyInputConnection(InputConnection target, boolean mutable,OnItemClickCallBackI onCallBackI) {super(target, mutable);
      if(onCallBackI!=null){this.onItemClickCallBackI=onCallBackI;
      }}@Override
   public Handler getHandler() {return new Handler();
   }@Override
   public boolean sendKeyEvent(KeyEvent event) {if(this.onItemClickCallBackI!=null){onItemClickCallBackI.callFirstBack(event);//按键事件回调
      }return super.sendKeyEvent(event);
   }@Override
   public boolean deleteSurroundingText(int beforeLength, int afterLength) {// magic: in latest Android, deleteSurroundingText(1, 0) will be called for backspace
      if (beforeLength == 1 && afterLength == 0) {// backspace
         return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))&& sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
      }return super.deleteSurroundingText(beforeLength, afterLength);
   }}

super.onCreateInputConnection(outAttrs) 华为青春版P8这个方法直接就返回空了,根本无法拦截

这就尴尬了,也一直在去搜索这方面知识,奈何时间又短,项目又紧张,根本没有时间去看系统代码,所以只能想其他办法,后面看到了EditText是如何拦截输入内容的,然后觉得如果将整个webview假设成为EditText有没有可能,没想到一试,还真行,代码如下:

    

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {super.onCreateInputConnection(outAttrs);
   return new MyInputConnection(new InputView(MyWebView.this,false,onItemTextClickCallBackI),
         true,onItemClickCallBackI);//InputView自己定义的继承基础输入链接桥梁类,}
public class InputView extends BaseInputConnection {private OnItemClickCallBackI onItemTextClickCallBackI;

   public InputView(View targetView, boolean fullEditor,OnItemClickCallBackI textClickCallBackI) {super(targetView, fullEditor);
      this.onItemTextClickCallBackI=textClickCallBackI;
   }@Override
   public boolean commitText(CharSequence text, int newCursorPosition) {//System.out.println("截获的文字   :"+text);
      onItemTextClickCallBackI.callFirstBack(text);//文字拦截回调      return true;
   }
}
public class MyInputConnection extends InputConnectionWrapper {private OnItemClickCallBackI onItemClickCallBackI;
   public MyInputConnection(InputConnection target, boolean mutable,OnItemClickCallBackI onCallBackI) {super(target, mutable);
      if(onCallBackI!=null){this.onItemClickCallBackI=onCallBackI;
      }}@Override
   public Handler getHandler() {return new Handler();
   }@Override
   public boolean sendKeyEvent(KeyEvent event) {if(this.onItemClickCallBackI!=null){onItemClickCallBackI.callFirstBack(event);//事件拦截回调
      }return super.sendKeyEvent(event);
   }@Override
   public boolean deleteSurroundingText(int beforeLength, int afterLength) {// magic: in latest Android, deleteSurroundingText(1, 0) will be called for backspace
      if (beforeLength == 1 && afterLength == 0) {// backspace
         return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))&& sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
      }return super.deleteSurroundingText(beforeLength, afterLength);
   }}
为什么去写了两个回调方法,一个是回调输入的文字,一个是回调软键盘的事件,当你去看到EditText 写拦截事件的时候,也没有整这么多内部类,原因就是以为webview毕竟不是EditView,不这么搞,要出事,
MyInputConnection 主要是去拦截软键盘的事件,
InputView 主要是去拦截输入的内容,

可能你只需要拦截软键盘事件,拦截内容干什么,接下来,你就明白了,

由于webview毕竟不是EditView,而且又是自定义的输入桥梁,当你在6.0以上系统是没有问题的,可是等到了6.0以下包括6.0,你会发现,你拦截的这个输入桥梁,根本无法输入汉字,英文 又是完全正常,这就尴尬了,好比以上的代码都是白费,其实不然,换个思路补救一下就OK,这就是为什么会有 

InputView 这个类里面的 onItemTextClickCallBackI.callFirstBack(text);方法回调了
在回调的时候,将你拦截到的内容,传给js,让JS动态把这些字设到相应的控件上

这样中文 英文 都没有问题了,当然了,如果你有时间,可以去研究下系统源码,会有更好的处理中文和英文的办法

总的来说,解决办法就是 重新搭建 android 与webview的输入链接桥梁,拦截输入事件和内容,回调给js,这样在目前我实测了大量的手机下是没有问题的,

希望以上内容对您有所帮助,如果有更好的办法,还请指点


http://www.ppmy.cn/news/794292.html

相关文章

监听软键盘中的删除键

最近因为项目需要,要监听软键盘中的删除键,在网上搜了大部分的说法,用onKeyListener,但是不知道为什么,设置后并没有效果,最后自己通过dispatchKeyEvent实现了,代码如下 Overridepublic boolean…

JS监听安卓软键盘删除键

web前端开发去整移动端页面真实老折磨了 input反正不论是什么dom肯定都能触发的,那就在input的回调里面看输入类型 这次需求要做光标定位,得上selection和range那一套所以用的是div,但是input也是OK的 然后这个东西好就好在IOS也是兼容的 &…

无源光网络(PON)介绍及其应用

文章目录 1、无源光网络(PON)介绍ONU(Optical Network Unit),光网络单元OLT(Optical line terminal),光线路终端 2、FTTH、FTTB、FTTR组网介绍FTTR组网规划 3、局端接入设备产品介绍…

Todo-List案例版本二

(160条消息) Todo-List案例版本一_bubbleJessica的博客-CSDN博客 引入了localStorage&#xff0c;让案例更加完善 src/App.vue <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHe…

FPGA纯verilog实现UDP协议栈,GMII接口驱动88E1111,提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、该UDP协议栈性能4、详细设计方案网络PHYGMII AXIS接口模块AXIS FIFOUDP协议栈 5、vivado工程1-->B50610 工程6、上板调试验证并演示准备工作查看ARPUDP数据回环测试 7、福利&#xff1a;工程代码的获取 1、前言 目前网上的fpga实现ud…

docker版jxTMS使用指南:数据源之modbus

本文讲解4.2版jxTMS如何用数据源访问modbus设备&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.2版升级内容 docker版本的使用&#xff0c;请参考docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请查看&#xff1a;4.0版升级内容 在…

2023年华中杯数学建模C题空气质量预测与预警解题全过程文档及程序

2023年华中杯数学建模 C题 空气质量预测与预警 原题再现 空气污染对人类健康、生态环境、社会经济造成危害&#xff0c;其污染水平受诸多因素的影响&#xff0c;如 PM2.5、PM10、CO、气温、风速、降水量等&#xff0c;探究 PM2.5 等污染物浓度的因素&#xff0c;更精准的预测…

五.LLC谐振变换器

LLC 谐振变换器启动过程分析 LLC 谐振变换器的组成结构中包含容性器件&#xff0c;为了尽可能减小输出电压纹波&#xff0c;钳位输出电压&#xff0c;此时希望输出滤波电容尽可能的大&#xff0c;因此也会在启动的时候&#xff0c;电容两端电压近似为 0&#xff0c;系统对电容…