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。如下所示:

Java代码:

  1. <service android:name=".DemoIme"
  2. android:label="@string/ime_name"
  3. android:permission="android.permission.BIND_INPUT_METHOD">
  4. <intent-filter>
  5. <action android:name="android.view.InputMethod" />
  6. </intent-filter>
  7. <meta-data android:name="android.view.im" android:resource="@xml/method" />
  8. </service>

复制代码
       如果输入法允许用户调整设置,那么你还应该提供一个 setting activity。这个时候不要忘记在 input-method的 XML文件中,加入相关的属性,如以下所示(这个文件就是刚才 meta-data中的 @xml/method):

Java代码:

  1. <input-method xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:settingsActivity="com.demo.SettingsActivity"
  3. 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)。在编辑文本框 时, android.view.inputmethod.InputConnection有一些很有用的方法,例如 getTextBeforeCursor()等等。

Android 平台开发一个输入法相关推荐

  1. Android平台开发指导(Android Porting Guide)

    本文为Android平台开发人员和Android设备制造商提供了底层开发指导.如果你对Android的上层应用开发很感兴趣,请访问Android Developers Site. 关于这份指导书 这份 ...

  2. 基于Android平台开发的手电筒Light

    基于Android平台开发的手电筒Light 1.     需求分析: 在现代社会中,手机的功能越来越完善,手电筒就是这些功能中必不可少的一种.当行走在漆黑的道路上,当你在黑暗狭小的地方寻找物品,当你 ...

  3. 使用Android studio开发一个数独游戏APP 系列第一讲

    数独是一种需要进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并且满足每一行.每一列.每一个粗线宫内的数字均含1-9,不能重复.随着各种报刊杂志刊登了数独游戏,也让越 ...

  4. 关于 Android 平台开发相关的有哪些推荐书籍?

    转自:http://www.zhihu.com/question/19579609 作者:Shan Huang 链接:http://www.zhihu.com/question/19579609/an ...

  5. 宁愿写两遍代码,也不用C++跨iOS、Android平台开发?

    作者丨赵钰莹.小智 Dropbox 最近宣布将放弃用 C++ 编写跨 iOS.Android 平台代码,转而使用各平台的原生框架(Swift/Kotlin),理由是代码共享相关的隐藏成本太高.有趣的是 ...

  6. Android下创建一个输入法

    输入法是一种可以让用户输入文字的控件.Android提供了一套可扩展的输入法框架,使得应用程序可以让用户选择各种类型的输入法,比如基于触屏的键盘输入或者基于语音.当安装了特定输入法之后,用户即可在系统 ...

  7. android乐视视频直播技术,乐视网进军android平台开发领域

    "2012 年第二届中国 Android 应用开发合作大会"( The Second China Android developer Cooperatio Conference 2 ...

  8. Android安卓-开发一个android桌面

    从0开始 开发一个属于自己的桌面程序 最近在开发一个新项目,需要把应用改成桌面,并引导用户设置为默认桌面,完成后的效果如下图: 1.添加XML <activity android:name=&q ...

  9. android编程获取网络和wifi状态及调用网络设置界面,Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面 - Android平台开发技术 - 博客园...

    获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...

最新文章

  1. linux安装java_linux中替换系统自带的OpenJDK
  2. 信息系统项目管理师采购管理
  3. Git 的安装与初次使用 —— Git 学习笔记 03
  4. html标签名缩写与英文全称对照表
  5. Android UI之困 横跨四个屏幕的战争
  6. Spring Boot笔记-目前对Web后端开发的认识
  7. 爱因斯坦耗费近十年的最伟大研究,推导出什么神预言?
  8. Win10 Explorer v1.3 有趣创意WordPress主题
  9. C# 使用Bitmap类进行图片裁剪
  10. 为什么腾讯云要自研云原生数据库 CynosDB?
  11. 【Linux】如何查看命令运行历史时间以及操作人IP
  12. 数据分析案例-电影数据分析
  13. 如何删除Windows我的电脑地址栏搜索记录
  14. 艾德卡EDEKA EDI 需求分析
  15. 怎样用CorelDRAW中透镜效果制作镂空球体
  16. 广告联盟EMU的理解
  17. 阿拉伯世界的历史现状与前景2019尔雅满分答案
  18. PHP Fatal error: Uncaught Error: Class ‘\Elasticsearch\Serializers\SmartSerializer‘ not found in /h
  19. python爬虫下载王者荣耀图片
  20. 终极解决大黄峰黑屏加信号问题,觉得有用请顶我

热门文章

  1. K60用IRA通过j-link下载失败,解决方法
  2. vue+element pdf预览
  3. 不重复发明轮子 -- 模板模式 (Template Pattern) 介绍 使用场景案例分析 优缺点 及代码演示
  4. 高并发:线程、线程锁与线程池(精华),文中附上一个手写代码实现线程池视频(c/c++语言)
  5. Tagging Testing for Android, iOS and Web
  6. 研究型论文_基于双层异质集成学习器的入侵检测方法
  7. ARM 平台跑VXI 11 服务器 调试记录
  8. Android—— 手机返回键到主界面,不关闭APP
  9. 2018年安卓应用市场上架方法
  10. [他山之玉]施一公:少年壮志不言愁