Android IMF输入法总结

IMF是input method framework的简称, 它是Android 1.5新添加进去的一个重要功能,用来支持软键盘、各种的输入法。
到目前位置(2009-04-03),Android 1.5还没有正式发布,但IMF的功能已经很稳定,其上已经存在有3种输入法。分别是
LatinIME(软键盘)、 OpenWnn(CJK输入法)、PinyinIME(GOOGLE 拼音),还缺少中文的手写、五笔。
虽说按照已有的输入法模块, 也能写出自己想要的输入法。但是弄懂底层一些的东西,对于写新的输入法还是有帮助的。
相关代码的位置:
frameworks/base/core/java/com/android/internal/view/
IMF接口定义
frameworks/base/core/java/android/view/inputmothod/
IMF客户端
frameworks/base/core/java/android/inputmethodservice/
IMF服务端
frameworks/base/services/java/com/android/server/InputMethodManagerService.java
输入法管理服务
packages/inputmethods/
现有的输入法
development/samples/SoftKeyboard/
软键盘示例
frameworks/base/core/java/android/view/View.java
frameworks/base/core/java/android/widget/TextView.java
控件和输入法的交互
按照SDK文档的叙述,IMF包含3个主要部分:
1、input method manager (IMM)
相当于客户端的API,协调其它部分的互动,负责跟系统服务(IMMS) 通讯。
2、input method (IME)
界面和输入法引擎, 处理用户的输入。
3、client applications
传递一些信息, IMM用来决定焦点和IME状态, IME一次只能有一个Client连接。
InputMethodManager
实例化的时候, 会连接到IMMS服务,然后一些调用里会请求IMMS的服务。
InputMethodManagerService
处理来自InputMethodManager的请求,管理输入法服务。
初始化的时候,会做如下一些事情:
1、注册一些系统事件,处理事件(开关屏、关闭系统对话框、包改变)跟输入法的交互, 例如: 关屏时会把输入法菜单关闭;
输入法包被删除时,将输入法从可用列表移除等。
2、加载输入法列表(buildInputMethodListLocked),读取启用的输入法,如果设置为空,加载全部输入法,并选择一个默认输入法。
3、加载状态栏图标、加载DB服务端。
View和输入法的交互
onFocusChanged()
失去焦点调用用imm.focusOut(), 得到焦点调用imm.focusIn()
onWindowFocusChanged
失去焦点调用用imm.focusOut(), 得到焦点调用imm.focusIn()
TextView和输入法的交互
setInputType()
改变输入法类型后, 会重启输入法imm.restartInput()
onEditorAction()
收到输入完成事件,隐藏输入法界面imm.hideSoftInputFromWindow()
onDraw()
输入框内容改变,更新输入法的内容imm.updateExtractedText
输入框文本被选择, 更新输入法的选择信息imm.updateSelection
输入框的光标位置改变, 更新输入法的光标位置imm.updateCursor
ps. imm.isWatchingCursor
onKeyUp()
收到KEYCODE_DPAD_CENTER按键事件, 显示输入法界面imm.showSoftInput,这个事件鼠标左键点击,都是输入框获取焦点。
收到KeyEvent.KEYCODE_ENTER按键事件,状态是输入完成,关闭输入法界面 imm.hideSoftInputFromWindow()
onTouchEvent()
触屏事件, 输入框获取焦点, 显示输入法界面imm.showSoftInput
isInputMethodTarget()
调用imm.isActive(), 用来判断此控件是否启用输入法
onTextContextMenuItem()
如果用户选择了“切换输入法”(ID_SWITCH_INPUT_METHOD),显示输入法菜单imm.showInputMethodPicker
setKeyListener()
每次调用都重启输入法imm.restartInput()
setText()
输入框内容改变, 重启输入法imm.restartInput()

 

转自:http://www.getideas.cn/?p=231

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值