为 Android 平台开发一个输入法
学习目标:
- 实现新的输入法
学习目的:
- 掌握Android输入法框架
学习收获:
Android 1.5 新特色之一就是输入法框架(Input Method Framework,IMF),正是它的出现,才为诞生不带实体键盘的设备提供了可能。IMF设计用来支持不同的IME,包括了soft keyboard,hand-writing recognizes和hard keyboard translators。这里,我们把焦点锁定在soft keyboard上。
新特色对普通应用开发者而言,应该确保让应用能够和IMF很好的配合,提供优秀的用户体验。应用要做的最重要事情,就是对每个EditText使用 新的属性android:inputType,这个属性实际代替了很多已经存在的属性,包括android:password, android:singleLine, android:numeric, android:phoneNumber, android:capitalize, android:autoText, android:editable。如果你两个都声明了,Cupcake设备就会使用新的android:inputType属性,而忽视其他的。
主要的API就是android.view.inputmethod.InputMethodManager,你可以通过Context.getSystemService方法来获取。它允许你和全局输入法状态进行交互,例如显式隐藏或者显示IME的输入法区域。
新特色对于系统开发人员而言,其提供了开发各种各样语言输入法的实现入口,有了它,其他语言输入法才能进驻Android。以下内容即关注如何实现一个输入法。
要创建一个输入法,需要继承android.inputmethodservice.InputMethodService。这个类提供了输入法的 基本实现,包括状态管理、控制输入法可见,还有和当前activity通讯。Android提供了两个输入法和一个示例,这两个输入法分别是 PinyinIME和LatinIME输入法,你可以在源码packages/inputmethods下找到,示例即SoftKeyboard,可以在 SDK 1.5下的platforms/android-1.5/samples下找到。这三个输入法提供了目前实现Android平台输入法实现的最佳参考。
输入法的打包方式和其他应用是相同的,在AndroidManifest.xml中,要把输入法声明为service,并附带上合适的intent filter和相关的meta data。如下所示:
<service android:name=".DemoIme"
android:label="@string/ime_name"
android:permission="android.permission.BIND_INPUT_METHOD">
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
<meta-data android:name="android.view.im" android:resource="@xml/method" />
</service>
如果输入法允许用户调整设置,那么你还应该提供一个setting activity。这个时候不要忘记在input-method的XML文件中,加入相关的属性,如以下所示(这个文件就是刚才meta-data中的@xml/method):
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.demo.SettingsActivity"
android:isDefault="@bool/im_is_default" />
输入法在UI展现上,有两个主要的可见元素,input view和candiate view。但这不是必需的,可以根据实际需要选择你需要的元素。Input View,是用户从键盘、手写或者其他方式输入文本的地方。当输入法第一次展现的时 候,InputMethodService.onCreateInputView()就会被调用。Candidates View,是候选词汇集合出现的地方。其可有可无,可以在调用InputMethodService.onCreateCandidatesView时返 回null,–这是它的默认行为。
应用的文本区可以有不同的输入类型,包括文本、数值、URL、邮箱地址和搜索,因此在你实现新的输入法时,需要当心不同的输入类型。输入法并不会自 动切换不同的输入类型,所以你要在IME中支持所有的类型。不过可以轻松一点的是, IME并不负责输入内容的校验,—因为这是应用的职责。网页模板
InputMethodService.onStartInputView()被调用时,会传入一个EditorInfo对象,这个对象包含了关于 输入类型和text field的其他属性的细节。EditorInfo.inputType和EditorInfo.TYPE_CLASS_MASK可以是很多值,包括 TYPE_CLASS_NUMBER,TYPE_CLASS_DATETIME,TYPE_CLASS_PHONE,TYPE_CLASS_TEXT。可 以通过android.text.InputType了解更多信息。
要把文本发送给应用有两种方式,你可以发送单一的按键事件,也可以在应用的文本框内编辑光标附近的文本。发送按键事件,可以简单构造 KeyEvent对象,并且调用InputConnection.sendKeyEvent(),或者更加方便一点,使用 InputMethodService.sendDownUpKeyEvents(keyEventCode)。http://www.huiyi8.com/moban/在编辑文本框 时,android.view.inputmethod.InputConnection有一些很有用的方法,例如 getTextBeforeCursor()等等。
为 Android 平台开发一个输入法的更多相关文章
- 最初程序员的思维“修炼”之四——Android平台开发的“强制关闭”解决思路
我和我的朋友参加一个比赛——物联网应用技能大赛,这个大赛所要求的技能有,硬件技术,Android平台开发技术,.NET平台开发技术,所以这是一个团队合作的比赛,基本上没有人能同时掌握这三种技术(在校生 ...
- Android studio 开发一个用户登录界面
Android studio 开发一个用户登录界面 activity_main.xml <?xml version="1.0" encoding="utf-8&qu ...
- 调研Android平台开发环境的发展演变
Android是Google推出的开源手机操作系统,主要以开发应用为主,要进行Android开发首先得搭建好开发平台.最近在搭建Android的开发环境,发现往往一个小问题都能花费你大半天时间,从刚开 ...
- 关于 Android 平台开发相关的有哪些推荐书籍?
转自:http://www.zhihu.com/question/19579609 作者:Shan Huang 链接:http://www.zhihu.com/question/19579609/an ...
- Android下创建一个输入法
输入法是一种可以让用户输入文字的控件.Android提供了一套可扩展的输入法框架,使得应用程序可以让用户选择各种类型的输入法,比如基于触屏的键盘输入或者基于语音.当安装了特定输入法之后,用户即可在系统 ...
- 从Objective-C转战C++ Android平台开发实践(C++/Java)
是否使用虚拟方法 最好在不用“virtual”关键字的情况下声明所有cpp成员方法 但是在写CPP头文件时,请检查有没有父类的方法被当前的工作覆盖.如果有,请确保将这些方法改为虚拟方法. 如果从父类继 ...
- <2014 05 10> Android平台开发攻略
1.标准SDK开发: IDE: Eclipse Netbeans Language: Java 2.标准NDK+SDK开发: IDE: Eclipse Language: Java(JNI) C/C+ ...
- Android平台开发-WIFI 驱动移植 -- 详细
一.WIFI的基本架构(代码路径) 1.WIFI Settings应用程序: packages/apps/Settings/src/com/android/settings/wif ...
- Android平台RTMP/RTSP播放器开发系列--解码和绘制
本文主要抛砖引玉,粗略介绍下Android平台RTMP/RTSP播放器中解码和绘制相关的部分(Github). 解码 提到解码,大家都知道软硬解,甚至一些公司觉得硬解码已经足够通用,慢慢抛弃软解了,如 ...
随机推荐
- PyTorch学习笔记之CBOW模型实践
import torch from torch import nn, optim from torch.autograd import Variable import torch.nn.functio ...
- Android中的动画总结
文章主要内容来源<Android开发艺术探索>,部分内容来源网上的文章,文中会有链接. Android系统提供了两个动画框架:属性动画框架和View动画框架. 两个动画框架都是可行的选项, ...
- javascript 对象初探 (六)--- call()和apply()初探
在javascript中,每个函数都具有call()和apply()两个方法,您可以用她们来触发函数,并指定相关的调用参数. 此外,这两个方法还有另一个功能,就是她可以让一个对象去‘借用‘另一个对象的 ...
- TSimpleMsgPack的样例代码
TSimpleMsgPack的样例代码 unit uMain; interface uses SimpleMsgPack, Windows, Messages, SysUtils, Variants, ...
- 零基础学python-3.7 还有一个程序 python读写文本
今天我们引入另外一个程序,文件的读写 我们先把简单的程序代码贴上.然后通过我们多次的改进.希望最后可以变成一个简单的文本编辑器 以下是我们最简单的代码: 'crudfile--读写文件' def re ...
- C# trim split dataGrid
C#中Trim().TrimStart().TrimEnd()的用法: 这三个方法用于删除字符串头尾出现的某些字符.Trim()删除字符串头部及尾部出现的空格,删除的过程为从外到内,直到碰到一 ...
- smali函数分析
一.函数调用 smali中的函数和成员变量也分为两种,分别为 direct 和 virtual 两者的区别 1.direct method 是指private函数 2.virtual method 是 ...
- caffe搭建--caffe在invidia+cpu 酷睿2Q9300 + ubuntu16.04.2上面的安装和编译过程
本文原创,转载请注明出处. ------------------------------------------------分割线-------------------------------- 概要 ...
- ffmpeg api升级到3.3 api变化
void av_free_packet(AVPacket * pkt) Use void av_packet_unref(AVPacket * pkt) Wipe the packet. Unref ...
- shell脚本定时任务 ( linux系统)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGV5YW5nanVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...