Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9465794
  • 博文数量: 1751
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20101
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1751)

文章存档

2024年(26)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: LINUX

2010-01-12 15:42:55

Android中创建一种新的输入法(Creating an Input Method))

译自http://android-developers.blogsp ... g-input-method.html
by Fly Fire  如需转载,请注明来源 www.yddev.com

一.
1.创建一个新的输入法需要继承android.inputmethodservice.InputMethodService,这个类提供了一个输入法
的基本实现,例子可以参考sdk中的SoftKeyboard的代码。

2.输入法跟其他application或service一样会被打包成一个apk,在 AndroidManifest.xml,把它声明成一个
service.
  1. android="android.com/apk/res/android"
  2.         package="com.example.fastinput">

  3.     android:label="@string/app_label">

  4.         
  5.         android:name="FastInputIME"
  6.             android:label="@string/fast_input_label"
  7.             android:permission="android.permission.BIND_INPUT_METHOD">
  8.             
  9.                 android:name="android.view.InputMethod" />
  10.             
  11.             android:name="android.view.im" android:resource="@xml/method" />
  12.         

  13.         
  14.         android:name="FastInputIMESettings" android:label="@string/fast_input_settings">
  15.             
  16.                 android:name="android.intent.action.MAIN"/>
  17.             
  18.         
  19.    
复制代码
3.输入法的service生命周期如下


二.输入法界面元素

输入法有2个主要的界面元素,InputView与Candidates View。
InputView:是用户输入文字的地方,当输入法被显示的时候会调用InputMethodService.onCreateInputView()
,在这个函数里创建和返回你想在输入法窗口中显示的Input View.
Candidates View:是用来提供输入选择,在函数InputMethodService.onCreateCandidatesView()中创建,默认
为空。

三.设计不同的输入类型
  一个程序的文本框可能有不同的输入类型,比如字符,数字,url,email地址等,当你实现一种输入法的时候你
就需要知道不同输入方式的区别,输入法不会自动根据不同的输入类型来切换,所以你的输入法需要支持所有的
输入类型。至于输入数据的验证就交由应用程序去负责。

例如,Android中一个Latin输入法提供的字符与数字输入的界面:




调用InputMethodService.onStartInputView()的时候会传递一个 EditorInfo对象来判断输入类型。
例如使用(EditorInfo.inputType & EditorInfo.TYPE_CLASS_MASK)来判断是属于下面的哪种类型:
TYPE_CLASS_NUMBER
TYPE_CLASS_DATETIME
TYPE_CLASS_PHONE
TYPE_CLASS_TEXT

  密码输入:注意不要在你的界面中显示密码,除了提醒用户外也不要把密码保存起来。

四.把输入文本传送给应用程序
   1.可以发送一个key event来实现
  1. InputConnection ic = getCurrentInputConnection();
  2. long eventTime = SystemClock.uptimeMillis();
  3. ic.sendKeyEvent(new KeyEvent(eventTime, eventTime,
  4.     KeyEvent.ACTION_DOWN, keyEventCode, 0, 0, 0, 0,
  5.     KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));
  6. ic.sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime,
  7.     KeyEvent.ACTION_UP, keyEventCode, 0, 0, 0, 0,
  8.     KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));
复制代码
或者
  1. InputMethodService.sendDownUpKeyEvents(keyEventCode);
复制代码
建议对于一些输入模式使用第一种方法,因为有些按键可能被过滤。

   2.通过编辑输入文本,主要使用以下方法。
  1. getTextBeforeCursor()
  2. getTextAfterCursor()
  3. deleteSurroundingText()
  4. commitText()
复制代码
比如,一个以Fell开头的文本,你想把它替换成Hello!
  1. InputConnection ic = getCurrentInputConnection();
  2. ic.deleteSurroundingText(4, 0);
  3. ic.commitText("Hello", 1);
  4. ic.commitText("!", 1);
复制代码
五.联想输入
  如果你需要联想输入或者输入过程中动态预测输入的文本,你可以参考如下代码:
  1. InputConnection ic = getCurrentInputConnection();
  2. ic.setComposingText("Composi", 1);
  3. ...
  4. ic.setComposingText("Composin", 1);
  5. ...
  6. ic.commitText("Composing ", 1);
复制代码






六.拦截硬件按键消息
尽管输入法窗口没有foucs,但是它最先收到硬件的按键消息,如果需要处理这些硬件按键消息,你只需要
重写InputMethodService.onKeyDown() 与InputMethodService.onKeyUp(),如果你不想处理某个按键,记得调
用super.onKey* 。

七.其他注意点
   1.提供一个用户可以直接从当前输入法进行相关输入法设置的方式。
   2.提供一个用户可以切换不同输入法的方式。
   3.让输入法界面尽快的弹出,资源或者耗时长的操作可以稍后加载。
   4.当输入法窗口被隐藏的时候,大块的内存分配最好尽快释放
   5.确保输入法能包含最常用的字符。

八.例子:
可以参考LatinIME的例子:

或者1.5 SDK也提供了一个SoftKeyboard的例子。
阅读(6038) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~