• 联系我们
  • 首页TipsTips7

    [Tips7] SIMPLEIME开发

    android现在在世界上很流行,我们也正在做关于android方面的开发,一直以来,我都想做一个自己的IME,因为android自带的IME使用起来可能不是很方便,他会占据大半个屏幕,而我们在填写用户名密码的时候,没有必要去使用这么大的一个键盘。前几天做了一个simpleIME,虽然android也有一个demo,但是这个demo没有解释,我研究了两天才有点眉目,网上的资料也有不少,现在我就把自己的经验分享给大家,希望大家批评指正。 在这个SimpleIME中,我做了一个简单的实现,如果各位还有什么idea ,可以一起分享下,毕竟我也不是一个高手。首先我们来看一下这个IME的形状。



    大家可以看到左边的123是对键盘字母间的转换,del就不用说了,还有一个向下的箭头,好再看两张图片。


                   那么如何做出来呢,我们来一起探讨吧。

    ■ 1, 配置manifest.xml文件

    首先我们要对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方法,没关系,在使用的时候慢慢介绍。

    ■ 2, xml 的键盘布局

    下一步我们写一下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就是这样,还有些细节东西没有提到,这是需要开发者去自己定义自己所需要的功能。

    ■ 3, 在系统setting中的local&text添加自己想要的东西

    还有一点就是在系统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

  • 联系我们
  • 新闻发布
  • Anhui Opensource Inc.

    Copyright (C) Anhui OSS All Rights Reserved.