android现在在世界上很流行,我们也正在做关于android方面 的开发,一直以来,我都 想做一个自己的IME,因为android自带的IME使用起来可能不是很方便,他会占据大半个屏幕,而我们在填写用户名密码的时候 ,没有必要去使用这么大的一个键盘。前几天做了一个simpleIME ,虽然android也有一个demo,但是这个demo没有解释,我研究了两天才有点眉目,网上的资料也有不少,现在我就把自己的经验分享给大家,希望大家 批评指正。
在这个SimpleIME中,我做了一个简单的实现,如果各位还有什么idea ,可以一起分享下,毕竟我也不是一个高手。首先我们来看一下这个IME的形状。
大家 可以看到左边的123是对键盘字母间的转换,del就不用说了,还有一个向下的箭头,好再看两张图片。
那么如何做出来呢,我们来一起探讨吧。
1.首先我们要对manifest.xml文件进行配置。
如下图:
从manifest.xml中我们可以看出输入法就是一个Service,同时必须声明Service的Permission是BIND_INPUT_METHOD,确保 输入法和系统 相绑定。除了特殊 的Permission声明以外,输入法还应该声明其Intent Filter 的Action为“android.view.InputMethod”. 输入法的额外 信息可以通过<meta-data> 以名值对的形式发布:
要想实现输入法,需要对android.inputmethodservice.InputMethodService进行扩展。InputMethodService类提供 了关于输入法的标准实现,它是整个输入法的核心类,基于它用户可以开发出新的输入法。
下面我们先来看一下InputMethodService对象典型的生命周期,
对象的创建 --->oncreate()--->onCreateInputView()--->onCreateCandidatesView() --->onStartInputView() --->
开始输入文本 --->onFinishInput() --->onDestory() --->对象结束
其中 onFinishInput() --->输入结束后,转移到新的文本域进行输入 --->onStartInputView()
各位 ,它的生命周期就是这样,不过,我在做一个SimpleIME的时候 ,没有去用候选框,因为毕竟 是一个简单的IME,没有涉及到中文输入,而且如果使用了候选框的话,那么在切换布局的时候 肯定会很烦的,(候选框就是我们输入东西的时候在键盘的上方出现匹配的东西)。
当我们去继承InputMethodService 的时候 会有很多override方法,没关系,在使用的时候 慢慢 介绍。
下一步我们写一下xml 的键盘布局。如下图
看英文能够了解,keyLabel上的字母用来显示 在键盘上的。codes是相应字母的ascII码 ,当然,不是所有的东西都 会有ascII码,那些负值 是我们自定义的一些值,以后会用到,键盘布局就是这样,我们还有其它的一些布局都 是这样的,就不一一给出了。有些人会想到,写好这 些xml文件以后怎么引入进去呢。
用createKeyFromXml实例化所有的键。在LatinKeyboard中有个内部类,可以理解是用来做键的。
LatinKeyboardView也可以用来设置一些按键的特殊事件比如下面的代码:
protected boolean onLongPress(Key key) {
// TODO Auto-generated method stub
// if(key.codes[0]==Keyboard.KEYCODE_CANCEL){
if(Character.isLetter((char)key.codes[0])){
// getOnKeyboardActionListener().onKey(KEYCODE_OPTIONS, null);
getOnKeyboardActionListener().onKey(key.codes[0]-32, null);
return true;
}else{
return super.onLongPress(key);
}
这里写的是如果我们长按a的话,就会改变key的code值,去让他在文本框中显示A。
我们用下面的代码来加载xml文件。
@Override
public View onCreateInputView() {
// TODO Auto-generated method stub
mInputView = (KeyboardView)getLayoutInflater().inflate(R.layout.input, null);
mInputView.setOnKeyboardActionListener(this);
mInputView.setKeyboard(mQwertyKeyboard_a_f);
return mInputView;
}
注:R.layout.input 这个文件 是用来确定键盘显示的位置和大小
其它不再说了,见文知意了吧。最后会返回一个keyboard.
现在我们就可以在模拟器上显示出来一个键盘 的布局,但是输入时会没有任何响应,这是肯定的,我们还没有做这方面 的事。下面继续。
在onInitializeInterface()中初始化所有的键盘,以备不时之需。
在一个onkey()的方法中,我们去设置按键的响应及其处理的方法。
使用getCurrentInputConnection().commitText(String.valueOf((char)keyCode), 1);方法去向文本框中提交你输入的键。
最后别忘了我们在Finish后要去还原所有的东西,比如还原初始化的键盘。
其实大致的SimpleIME就是这样,还有些细节东西没有提到,这是需要开发者去自己定义自己所需要的功能。
还有一点就是在系统setting中的local&text添加自己想要的东西如图:
这个做法就是在 method.xml中加入
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.anhuioss.simpleime.LicenseActivity"
android:isDefault="true"
/>
method.xml 的引用在mainfest中 ,请向上看看就知道了。
look at it http://www.anhuioss.com/cn/lab/simt.html