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


更多相关文章

  1. android 监控软键盘确定 搜索 按钮并赋予点击事件
  2. Android(安卓)如何在自定义界面上启用输入法 (How to enable inp
  3. Android计算器低级错误?都是二进制惹的祸!
  4. Android(安卓)客户端访问服务器以及服务器开发
  5. Android之EditText特殊小技巧
  6. android键盘事件
  7. android软键盘问题
  8. Android软键盘用法实例
  9. android显示和隐藏键盘

随机推荐

  1. Android Activity和Intent机制
  2. (2019年10月更新) Android 最全的底部导
  3. Android炫酷的3D球型标签云开源库 3dTagC
  4. Android(安卓)Switch控件介绍
  5. 安卓 打开app进入第一个指定的Activity
  6. Android_百度地图BaiduMap_LocationClien
  7. 韩老师安卓笔记
  8. Android 锁屏生命周期问题
  9. 今天开始写android的照片浏览器(一)至返回
  10. 整理 酷炫 Android(安卓)开源UI框架 动画