学习目标:

  1. 实现新的输入法

学习目的:

  1. 掌握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 平台开发一个输入法的更多相关文章

  1. 最初程序员的思维“修炼”之四——Android平台开发的“强制关闭”解决思路

    我和我的朋友参加一个比赛——物联网应用技能大赛,这个大赛所要求的技能有,硬件技术,Android平台开发技术,.NET平台开发技术,所以这是一个团队合作的比赛,基本上没有人能同时掌握这三种技术(在校生 ...

  2. Android studio 开发一个用户登录界面

    Android studio 开发一个用户登录界面 activity_main.xml <?xml version="1.0" encoding="utf-8&qu ...

  3. 调研Android平台开发环境的发展演变

    Android是Google推出的开源手机操作系统,主要以开发应用为主,要进行Android开发首先得搭建好开发平台.最近在搭建Android的开发环境,发现往往一个小问题都能花费你大半天时间,从刚开 ...

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

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

  5. Android下创建一个输入法

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

  6. 从Objective-C转战C++ Android平台开发实践(C++/Java)

    是否使用虚拟方法 最好在不用“virtual”关键字的情况下声明所有cpp成员方法 但是在写CPP头文件时,请检查有没有父类的方法被当前的工作覆盖.如果有,请确保将这些方法改为虚拟方法. 如果从父类继 ...

  7. <2014 05 10> Android平台开发攻略

    1.标准SDK开发: IDE: Eclipse Netbeans Language: Java 2.标准NDK+SDK开发: IDE: Eclipse Language: Java(JNI) C/C+ ...

  8. Android平台开发-WIFI 驱动移植 -- 详细

    一.WIFI的基本架构(代码路径)     1.WIFI Settings应用程序:       packages/apps/Settings/src/com/android/settings/wif ...

  9. Android平台RTMP/RTSP播放器开发系列--解码和绘制

    本文主要抛砖引玉,粗略介绍下Android平台RTMP/RTSP播放器中解码和绘制相关的部分(Github). 解码 提到解码,大家都知道软硬解,甚至一些公司觉得硬解码已经足够通用,慢慢抛弃软解了,如 ...

随机推荐

  1. Unity -- 入门教程三

    进入这个页面,按编译器版本进行下载,我用的是2010,所以要下载这个. 安装就不用我教了,下面开始看我是如何导入Unity VS的. 点击Import之后我们会发现并没有发生什么,但是接下来我们按一下 ...

  2. Android 自定义录音、播放动画View,让你的录音浪起来

    最近公司项目有一个录音的录制和播放动画需求,然后时间是那么紧,那么赶紧开撸. 先看效果图 嗯,然后大致就是这样,按住录音,然后有一个倒计时,最外层一个进度条,还有一个类似模拟声波的动画效果(其实中间的 ...

  3. youtube-dl取代you-get?

    以前了解到you-get这个项目,支持超多视频网站下载,不过偶尔会出各种问题. 今天看到依云的博客文章:放弃 you-get,转投 youtube-dl 然后特地看了youtube-dl的支持列表:h ...

  4. What is love ? and how to do?

    1.匹配度(matched-degree): 灵性 文化(东西方.南北方) 智力 审美 性 2.对待差异的原则(The principle of difference): 抓大放小 求同存异 心脑并用 ...

  5. Android加壳native实现

    本例仅在Android2.3模拟器跑通过,假设要适配其它机型.请自行研究,这里不过抛砖引玉. 0x00 在Android中的Apk的加固(加壳)原理解析和实现,一文中脱壳代码都写在了java层非常ea ...

  6. 系统安全-LDAP

    LDAP服务器 1.目录服务  目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好像Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不同,它有优异的读性能 ...

  7. websotrom 2016.2 license Server

    license server” 输入:http://114.215.133.70:41017 仅供学习测试使用,支持正版.

  8. nginx+thinkphp pathinfo模式配置

    server { listen 81; server_name http://lanxing.cc gohosts.com; root "D:\WWW\lanxing\public" ...

  9. ecshop忘记管理员密码

    直接修改数据表 ecs_admin_user, 找到对应的管理员, 同时修改 password 为 2fc3ec4c91d51bee94f4a8ccbdbe5383 和 ec_salt 为1819, ...

  10. 04 json,xml混合封装通信

    <?php class Response_json_xml{ public static function show($code,$message="",$data=arra ...