为 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). 解码 提到解码,大家都知道软硬解,甚至一些公司觉得硬解码已经足够通用,慢慢抛弃软解了,如 ...
随机推荐
- Windows下Python的虚拟环境
前言 在开发python的应用程序的时候,有时候会遇到依赖包的版本问题,比如之前开发tensorflow应用的时候需要用到python3.5以下的版本(还是python3),但是日常做其它应用的时候用 ...
- openlayer3 加载geoserver发布的WFS服务
转自原文 openlayer3加载geoserver发布的WFS服务 openlayers3调用GeoServer发布的wfs 1 参考一 1.1 问题 openlayer3加载WFS存在跨域问题,需 ...
- 【swagger】2.swagger提供开发者文档--返回统一格式篇【spring mvc】【spring boot】
接着上一篇来说, 不管正常返回结果还是后台出现异常,应该返回给前台统一的响应格式. 所以这一篇就为了应对解决这个问题. ======================================== ...
- jquery怎么找到元素下面的第一个子元素
<ul><li>11</li><li>22</li><li>33</li><li>44</li&g ...
- 强大的开源网络侦查工具:IVRE
IVRE简介 IVRE(又名DRUNK)是一款开源的网络侦查框架工具,IVRE使用Nmap.Zmap进行主动网络探测.使用Bro.P0f等进行网络流量被动分析,探测结果存入数据库中,方便数据的查询.分 ...
- Java中HashMap遍历的两种方法(转)
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...
- Linux C高级编程——网络编程基础(1)
Linux高级编程--BSD socket的网络编程 宗旨:技术的学习是有限的,分享的精神是无限的. 一网络通信基础 TCP/IP协议簇基础:之所以称TCP/IP是一个协议簇,是由于TCP/IP包括T ...
- gulp是用来干什么的?(概念)
当我们在使用gulp的时候,gulp到底用来干什么呢? 编译 sass 合并优化压缩 css 校验压缩 js 优化图片 添加文件指纹(md5) 组件化头部底部(include html) 实时自动刷新 ...
- Node.js 是什么
Node.js 是什么 一个 “编码就绪” 服务器 Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理 ...
- Linux(centos 6.5) 调用java脚本以及定时运行的脚本实例及配置文件具体解释
Linux(centos 6.5) 调用java脚本以及定时运行的脚本实例 一.调用java程序脚本(默认已经搭建好了Java环境) 1.jdk 安装路径 /usr/jdk/jdk1.7/-- 2.j ...