本文会带来什么?
1. 输入法源码分析
2. 自定义一个数字键盘输入法
3. 一个界面输入框调用自定义输入法和系统输入法
4. 自定义汉字输入法
5. 系统输入法的一些api(软键盘高度,输入法厂商等)
一.和输入法有关的一些常见问题
1.如何获取软键盘是否弹出状态 ?
当前获取软键盘状态有两种方式:
A.监听界面view size变化
假定当前界面根ViewGroup为rootView,软键盘隐藏时,它的高度为屏幕高度,当软键盘弹出时,会触发rootView 的 size 变化,从而可以根据rootView高度是否等于屏幕高度-100dp()来判断可以隐藏或者显示屏幕底部虚拟按键导航栏,同样会引起size变化,为了杜绝这种情况,遂-100dp()
为什么要减去100dp?在有的手机上,例如
华为的某些机型上底部虚拟导航栏可以隐藏或者消失,同样会引起size变化
,为了杜绝这类情况,遂减去100dp(写到这里吐槽Google一百遍啊一百遍!!!),可见,这种方式也是有缺点的.
布局文件代码
1 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
1 | mRootLayout = (RelativeLayout) findViewById(R.id.root_layout); |
B.利用 InputMethodManager 来获取
这种方法需要提前说清楚的是,调用imm.showSoftInput方法从而得出软键盘状态,同时也会把软键盘强制弹出,这是个很让人纠结的问题,调用imm.hideSoftInputFromWindow也可以得到软键盘状态,但是会强制关闭软键盘(试过得到状态后强制软键盘回到之前状态,屏幕会闪动),所以,慎用(
有解决办法请告知
)
1 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); |
1 | private class IMMResult extends ResultReceiver { |
2.如何获取软键盘高度 ?
获取软键盘高度是根据本文前面一.1.A.获取软键盘是否弹出状态
中得到的,监听size变化,当软键盘弹出后size会改变,就可以拿到软键盘的高度,有其他方法请告知
1 | // 伪代码 |
3.如何获取系统所有输入法厂商等 ?
可以获取系统所有注册输入法的包名等信息,本地维护一个关于厂商和包名的小型数据库即可得到厂商
1 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); |
4.如何获取系统当前输入法厂商等 ?
可以获取当前默认输入法的ID(对应于 上文所说 一.3 中 id属性 inputMethodInfo.getId())
1 | // 对应于 上文所说 一.3 中 id属性 inputMethodInfo.getId() |
二.官方输入法sample源码分析
目的,通过分析官方源码来增加对输入法原理的理解
从SDK 1.5版本以后,Android就开放它的IMF(Input Method Framework),让我们能够开发自己的输入法。而开发输入法最好的参考就是Android自带的Sample-SoftKeyboard,虽然这个例子仅包含英文和数字输入,但是它本身还算完整和清楚,对我们开始Android开发实战有很大帮助。
下载的
sdk/sample/android-8/
以及sdk/samples/android-23/legacy/
下都有SoftKeyboard
源码,我们用android-8中的
原理分析文章
以下是传送门: