android 常用输入法,[转载]Android 系统输入法的调用

一.

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

2.输入法跟其他application或service一样会被打包成一个apk,在AndroidManifest.xml,把它声明成一个

Service.

3.输入法的service生命周期如下

a4c26d1e5885305701be709a3d33442f.png

二.输入法界面元素

输入法有2个主要的界面元素,InputView与Candidates View。

InputView:是用户输入文字的地方,当输入法被显示的时候会调用InputMethodService.onCreateInputView(),在这个函数里创建和返回你想在输入法窗口中显示的Input

View.

Candidates

View:是用来提供输入选择,在函数InputMethodService.onCreateCandidatesView()中创建,默认为空。

三.设计不同的输入类型

一个程序的文本框可能有不同的输入类型,比如字符,数字,url,email地址等,当你实现一种输入法的时候你就需要知道不同输入方式的区别,输入法不会自动根据不同的输入类型来切换,所以你的输入法需要支持所有的

输入类型。至于输入数据的验证就交由应用程序去负责。

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

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

调用InputMethodService.onStartInputView()的时候会传递一个

EditorInfo对象来判断输入类型。

例如使用(EditorInfo.inputType &

EditorInfo.TYPE_CLASS_MASK)来判断是属于下面的哪种类型:

TYPE_CLASS_NUMBER

TYPE_CLASS_DATETIME

TYPE_CLASS_PHONE

TYPE_CLASS_TEXT

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

四.把输入文本传送给应用程序

1.可以发送一个key event来实现

InputConnection ic = getCurrentInputConnection(); long eventTime =SystemClock.uptimeMillis(); ic.sendKeyEvent(new KeyEvent(eventTime, eventTime,KeyEvent.ACTION_DOWN, keyEventCode, 0, 0, 0, 0,KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE)); ic.sendKeyEvent(newKeyEvent(SystemClock.uptimeMillis(), eventTime, KeyEvent.ACTION_UP, keyEventCode, 0,0, 0, 0, KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));

InputMethodService.sendDownUpKeyEvents(keyEventCode);

建议对于一些输入模式使用第一种方法,因为有些按键可能被过滤。

2.通过编辑输入文本,主要使用以下方法。

getTextBeforeCursor() getTextAfterCursor() deleteSurroundingText() commitText()

比如,一个以Fell开头的文本,你想把它替换成Hello!

InputConnection ic = getCurrentInputConnection(); ic.deleteSurroundingText(4, 0);ic.commitText("Hello", 1); ic.commitText("!", 1);

五.联想输入

如果你需要联想输入或者输入过程中动态预测输入的文本,你可以参考如下代码:

InputConnection ic = getCurrentInputConnection(); ic.setComposingText("Composi", 1);... ic.setComposingText("Composin", 1); ... ic.commitText("Composing ", 1);

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

六.拦截硬件按键消息

尽管输入法窗口没有foucs,但是它最先收到硬件的按键消息,如果需要处理这些硬件按键消息,你只需要重写InputMethodService.onKeyDown()

与InputMethodService.onKeyUp(),如果你不想处理某个按键,记得调用super.onKey* 。

七.其他注意点

1.提供一个用户可以直接从当前输入法进行相关输入法设置的方式。

2.提供一个用户可以切换不同输入法的方式。

3.让输入法界面尽快的弹出,资源或者耗时长的操作可以稍后加载。

4.当输入法窗口被隐藏的时候,大块的内存分配最好尽快释放

5.确保输入法能包含最常用的字符。

转自:http://blog.csdn.net/wangjianli007/article/details/5793464

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值