前言
有些需求需要我们自定义View,这个View需要有接收系统键盘输入数据的能力,相信有些同学都是使用onKeyDown的监听方法实现的,但发现有些输入法获取不到数据。其实这个原因是onKeyDown方法主要是监听物理按键的响应,对于虚拟键盘有时是不生效的具体结果取决于各个输入法的实现。那么我们应该如何获取虚拟键盘的输入数据呢?其实大家仔细观察Api 可以发现有两个方法,onCheckIsTextEditor 和 onCreateInputConnection。其实Android中的虚拟键盘和我们的应用程序都是在不同的进程中运行的我们可以使用InputConnection这个类去接收虚拟键盘的数据。
Android输入法和App的数据交互大概的关系
关于这部分上图也只是讲了个大概关系,想要继续深入的同学可以看看下面三篇文章:
- https://developer.android.com/guide/topics/text/creating-input-method
- https://www.cnblogs.com/weixing/p/3300908.html
- https://www.aliyun.com/jiaocheng/595178.html
踩过的坑
大家在自定义View链接系统输入法的时候,这里有几个小坑给大家提出来一下:
- 我们的View是需要获取焦点的时候才能和系统输入法进行交互的。所以我们需要在TouchDown的时候,让我们的View获取焦点。
- 有的时候我们的键盘已经定向了一个View进行输出,那么我们需要重新定向下键盘对View的输出。这两点在代码里的体现如下:
- 由于不同输入法的实现可能不一样,我们通常重写BaseInputConnection中的commitText只能接受到‘a’,'b','c'等字符,像0-9和delete可能是接收不到的,我们需要在sendKeyKvent中监听,如下图:
Demo(自定义文本框)
这个是自定View文本框是可以获取虚拟键盘数据,此组件可以用于验证码,密码等。
下面是效果图,有需要的同学可以了解下: