SIMPLEIME开发

来源:互联网 发布:mac pro上没有USB 编辑:程序博客网 时间:2024/05/29 13:16

 

        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

 

 

 

 

 

 

 

原创粉丝点击