输入法编辑器(IME)是一个用户控件,使用户可以输入文本。 Android提供了一个可扩展的输入法框架,允许应用程序向用户提供其他输入方法,如屏幕上的键盘,甚至语音输入。安装所需的IME后,用户可以选择从系统中设置使用哪一个,并且在整个系统中使用它;只有一个IME可以一次被启用。


要将IME添加到Android系统,您可以创建包含扩展InputMethodService的类Android应用程序。此外,你通常创建通过选项来IME服务“设置”活动。您也可以定义的显示系统设置部分设置UI。


本指南包括以下内容:


该输入法的生命周期
声明IME组件在应用程序清单
该IME API
设计一个IME UI
从IME发送文本应用程序
与IME亚型工作
如果你还没有使用IME工作之前,你应该先输入法阅读介绍文章屏幕。此外,包含在SDK中的SoftKeyboard示例应用程序包含示例代码,您可以修改开始建立自己的输入法。


该IME生命周期


下图描述了IME的生命周期:


图1. IME的生命周期。
以下部分描述了如何实现与遵循这个生命周期的输入法相关的用户界面和代码。
声明IME组件的清单
在Android系统中,IME是含有一种特殊的IME服务的Android应用程序。应用程序的清单文件必须申报服务,要求必要的权限,规定动作action.view.InputMethod相匹配的意图过滤器,并提供一个定义输入法的特点元数据。此外,为了提供一个设置界面,允许用户修改输入法的行为,你可以定义可以从系统设置中启动了“设置”的活动。
下面的代码片段声明一个IME服务。它请求许可的BIND输入法,以允许服务给IME连接到系统,设置该操作android.view.InputMethod匹配的意图滤波器,并且限定的元数据的IME:

<!-- Declares the input method service -->  <service android:name="FastInputIME"    android:label="@string/fast_input_label"    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>
下一个片段声明了IME的设置活动。它有ACTION_MAIN,表示本次活动是为IME应用程序的主入口点的意图过滤器:

 <!-- Optional: an activity for controlling the IME settings -->  <activity android:name="FastInputIMESettings"    android:label="@string/fast_input_settings">    <intent-filter>      <action android:name="android.intent.action.MAIN"/>    </intent-filter>  </activity>
您也可以从它的UI提供访问IME的设置直接。


该输入法API


具体到输入法类的android.inputmethodservice被发现和android.view.inputmethod包。该KeyEvent类是用于处理键盘字符重要。


一个IME的中央部分是一个服务组件,延伸InputMethodService一类。除了实现正常的服务生命周期,这个类有提供你的输入法的用户界面,处理用户输入,并提供文本当前具有焦点领域的回调。默认情况下,InputMethodService类提供了大部分的实施管理的IME的状态和知名度,并与当前输入场通信。


下面的类也很重要:


BaseInputConnection
定义从INPUTMETHOD通信信道返回到正在接收其输入的应用程序。您可以使用它来读取光标周围的文本,提交文本到文本框,并发送​​原始关键事件给应用程序。应用而应扩展此类比实现的基本接口InputConnection。
KeyboardView
查看的扩展呈现键盘和响应用户输入事件。键盘布局由键盘的实例,你可以在一个XML文件中定义指定。
设计输入法的用户界面


有一个输入法的两个主要视觉元素:输入视图和候选视图。你只需要实施相关的你设计的输入法中的元素。


输入查看


输入视图是用户在keyclicks,手写或手势的形式输入文字的用户界面。当显示首次输入法,在系统调用onCreateInputView()回调。在实现此方法,您可以创建要在IME窗口来显示和布局返回系统布局。这个片段是实现onCreateInputView()方法的一个例子:

  @Override  public View onCreateInputView() {    MyKeyboardView inputView =      (MyKeyboardView) getLayoutInflater().inflate( R.layout.input, null);    inputView.setOnKeyboardActionListener(this);inputView.setKeyboard(mLatinKeyboard);    return mInputView;  }
在这个例子中,MyKeyboardView是KeyboardView的自定义实现呈现一个键盘的一个实例。如果你正在构建一个传统的QWERTY键盘,看到KeyboardView类。


考生查看


候选人的看法是那里的IME显示潜在的字更正或建议供用户选择UI。在IME生命周期,系统调用onCreateCandidatesView()当它准备以显示考生查看。在实现此方法,返回一个布局,显示单词建议,或者返回null如果你不想显示任何东西。空回应是默认的行为,所以你没有实现这个,如果你不提供建议。


举一个例子实现,它提供用户的建议,请参阅SoftKeyboard示例应用程序。


UI设计注意事项


本节介绍了输入法的一些具体的UI设计注意事项。


处理多个屏幕尺寸


您的IME用户界面必须能够扩展以不同的屏幕尺寸,而且还必须处理横向和纵向方向。在非全屏IME模式,留下足够的空间来显示文本字段和任何相关联的上下文,以便不超过半屏幕由IME占据的应用程序。在全屏IME模式,这不是一个问题。


处理不同的输入类型


Android的文本字段允许您设置一个特定的输入类型,如自由形式的文字,数字,网址,电子邮件地址和搜索字符串。当你实现一个新的输入法,你需要检测的每个字段的输入类型,并为其提供相应的接口。但是,您不必设置你的输入法来检查用户输入的输入类型的文本有效;这是拥有该文本字段的应用程序的责任。


例如,这里有拉丁IME提供Android平台提供的文字和电话号码输入界面截图:



图2.拉丁文IME输入类型。


当输入字段接收焦点和你的IME启动时,系统调用onStartInputView(),并传入包含有关输入类型和文本字段的其他属性细节的EditorInfo对象。在这个对象中,inputType下字段包含文本字段的输入类型。


在inputType下字段是包含位模式为不同的输入类型设置为int。为了测试它的文本字段的输入类型,随着不断TYPE_MASK_CLASS掩盖它,就像这样:

inputType & InputType.TYPE_MASK_CLASS
输入类型的位模式可以有多个值,包括其中一个:


TYPE_CLASS_NUMBER
输入数字的文本字段。如前面的屏幕截图所示,拉丁IME显示此类型的字段数字键盘。
TYPE_CLASS_DATETIME
用于输入日期和时间的文本字段。
TYPE_CLASS_PHONE
用于输入电话号码的文本字段。
TYPE_CLASS_TEXT
进入所有支持的字符的文本字段。
这些常量进行了更详细的inputType下的参考文档中描述的。


该inputType下字段可以包含其它位指示文本字段类型的变体,如:


TYPE_TEXT_VARIATION_PASSWORD
TYPE_CLASS_TEXT对输入密码的变体。输入法将显示装饰,而不是实际的文本。
TYPE_TEXT_VARIATION_URI
TYPE_CLASS_TEXT来输入网址时和其他统一资源标识符(URI)的变体。
TYPE_TEXT_FLAG_AUTO_COMPLETE
TYPE_CLASS_TEXT对输入文本的变体,从词典,搜索,或其他设施的申请“自动完成功能”。
记住,当你测试这些变种,以掩盖inputType下用适当的常数。可用屏蔽常数上市inputType下引用文档中获得。


注意:在您自己的输入法,一定要正确处理文字时将其发送到密码字段。隐藏在你无论是在输入视图和考生查看用户界面的密码。还记得,你不应该密码的存储设备上。要了解更多信息,请参阅安全指南的设计。


发送文本到应用程序


当用户输入文字时,IME,您可以通过发送各个关键事件或通过编辑应用程序的文本字段光标周围文本文本发送到应用程序。在这两种情况下,你使用InputConnection的实例提供的文本。为了得到这个实例,调用InputMethodService.getCurrentInputConnection()。


编辑光标周围的文本


当你在处理文本字段现有文本的编辑,一些在BaseInputConnection比较有用的方法是:


getTextBeforeCursor()
返回包含当前光标位置之前要求的字符数的CharSequence。
getTextAfterCursor()
返回包含下列当前光标位置要求的字符数的CharSequence。
deleteSurroundingText()
删除指定数目的字符之前和之后的当前光标位置。
commitText()
提交一个CharSequence的文本字段,并设置一个新的光标位置。
例如,下面的代码片段显示了如何将四个字符替换光标与文本的左侧“你好!”

  InputConnection ic = getCurrentInputConnection();  ic.deleteSurroundingText(4, 0);  ic.commitText("Hello", 1);  ic.commitText("!", 1);
在提交之前合成的文本


如果你确实IME文本预测或者需要多个步骤组成的字形或字,可以显示在文本字段的进展,直到用户提交的单词,然后您可以用文本完成更换部分组成。当你把它传递给你setComposingText可以通过添加一个“跨度”给它特殊处理的文本()。


下面的代码片段展示了如何显示文本领域的进展:

 InputConnection ic = getCurrentInputConnection();  ic.setComposingText("Composi", 1);...  ic.setComposingText("Composin", 1);...  ic.commitText("Composing ", 1);
下面的屏幕截图显示如何向用户显示:
图3.提交之前撰写的文字。
拦截硬件按键事件
尽管输入法窗口没有明确的焦点,它首先接收硬件密钥事件,并可以选择使用它们或沿应用程序转发。例如,您可能要消耗方向键组成在你的UI候选选择中导航。您可能还需要捕获返回键即可关闭输入法窗口发生的任何弹出窗口。
拦截硬件按键,覆盖的onkeydown()和的onkeyup()。见一个例子软键盘示例应用程序。
记住调用超()方法你不想自己处理键。
创建IME亚型
子类型允许IME揭露由IME支持多种输入方式和语言。子类型可以代表:
语言环境,如EN_US或在fr_FR
的输入模式,例如语音,键盘,或手写
其他输入风格,形式或属性特定于IME,诸如10键或QWERTY键盘布局。
基本上,模式可以是任意的文本,如“键盘”,“声音”,等等。 A亚型也可以公开这些的组合。
子类型信息被用于一个输入法切换对话框这可以从通知栏,也为IME设置。该信息还允许框架直接弹出一个输入法的具体亚型。当你建立一个输入法,使用子工厂,因为它可以帮助用户识别和不同输入法的语言和模式之间切换。
您在输入法的XML资源文件中的一个定义子类型,使用<亚型>元素。下面的代码片段定义了两种亚型的IME:键盘亚型为美国英语语言环境,并为法语语言环境法国另一个键盘亚型:

<input-method xmlns:android="http://schemas.android.com/apk/res/android"    android:settingsActivity="com.example.softkeyboard.Settings"    android:icon="@drawable/ime_icon"  <subtype android:name="@string/display_name_english_keyboard_ime"      android:icon="@drawable/subtype_icon_english_keyboard_ime"      android:imeSubtypeLanguage="en_US"      android:imeSubtypeMode="keyboard"      android:imeSubtypeExtraValue="somePrivateOption=true"  />  <subtype android:name="@string/display_name_french_keyboard_ime"      android:icon="@drawable/subtype_icon_french_keyboard_ime"      android:imeSubtypeLanguage="fr_FR"      android:imeSubtypeMode="keyboard"      android:imeSubtypeExtraValue="foobar=30,someInternalOption=false"  />  <subtype android:name="@string/display_name_german_keyboard_ime"      ...  />/>
为了确保您的亚型在UI正确贴上标签,用%S得到一个亚型的标签是一样的亚型区域设置标签。这表现在接下来的两个片段。第一个片段显示输出方式XML文件的一部分:

 <subtype    android:label="@string/label_subtype_generic"    android:imeSubtypeLocale="en_US"    android:icon="@drawable/icon_en_us"    android:imeSubtypeMode="keyboard" />
接下来的片段是输入法的的strings.xml文件的一部分。字符串资源标签亚型通用的,其中所使用的输入法UI定义设置亚型标签,被定义为:

<string name="label_subtype_generic">%s</string>
此设置导致子类型的显示名称相匹配的区域设置。例如,在任何英语语言环境中,显示名称为“英语(美国)”。


从通知栏选择IME亚型


Android系统负责管理所有的IME暴露所有子类型。 IME亚型被视为它们所属的IME的模式。在通知栏,用户可以选择当前设置的IME可用的亚型,如在下面的截图:




图4.选择从通知栏的输入法亚型。




图5.设置亚型偏好系统设置。


从系统设置选择IME亚型


用户可以控制如何亚型中的系统设置区“语言和输入”设置面板使用。在SoftKeyboard示例应用程序,该文件包含InputMethodSettingsFragment.java了有助于在输入法设置一个亚型推动者的实现。请参阅在Android SDK的SoftKeyboard示例应用程序以获取有关如何支持输入法亚型的IME的更多信息。




图6.选择的IME的语言。


IME亚型间切换


可以允许用户通过提供一个交换密钥,如地球状语言图标,键盘的一部分的多个IME亚型之间容易切换​​。这样做可以极大的提高了键盘的可用性,并能帮助避免用户受挫。为了使这样的开关,执行以下步骤:


声明supportsSwitchingToNextInputMethod =在输入法的XML资源文件“真”。你的声明应该类似于下面的代码片段:

<input-method xmlns:android="http://schemas.android.com/apk/res/android"    android:settingsActivity="com.example.softkeyboard.Settings"    android:icon="@drawable/ime_icon"    android:supportsSwitchingToNextInputMethod="true">
调用shouldOfferSwitchingToNextInputMethod()方法。
如果该方法返回true,显示切换键。
当用户点击切换键,调用switchToNextInputMethod(),传递虚假的第二个参数。假值指示系统一样,把所有的亚型不管是什么IME他们属于。指定true需要通过当前IME亚型系统循环。
注意:到Android 5.0(API等级21),switchToNextInputMethod()之前是不知道supportsSwitchingToNextInputMethod属性。如果用户切换到IME不用切换按键,他或她可能会停留在该IME,无法方便地切换的出来。


一般IME注意事项


这里有一些其他的事情要考虑为你实现你的IME:


为用户提供直接从IME的UI设置选项的方式。
因为多个输入法编辑器可以在设备上安装,提供给用户,以直接从输入方法的用户界面切换到不同的IME的方法。
快速调出输入法的用户界面。预加载或按需加载任何大的资源,使用户尽快看到IME,因为他们挖掘的文本字段。高速缓存资源和视图输入法的后续调用。
相反,你应该释放大量内存分配输入法窗口隐藏后不久,可以使应用程序有足够的内存来运行。考虑使用延迟消息来释放资源,如果IME处于隐藏状态几秒钟。
确保用户可以与IME相关的语言或区域尽可能进入尽可能多的字符。请记住,用户可以在密码或用户名使用标点符号,所以你的输入法已提供了许多不同的角色,让用户输入密码并访问该设备。

更多相关文章

  1. 第17天android:《android从零开始》视频(1-5)
  2. Android(安卓)EditView
  3. Android下模拟按键输入
  4. [RK3399][Android7.1] 调试笔记 --- 设置搜狗为开机默认输入法
  5. Android(安卓)EditText不弹出软键盘
  6. Android入门学习笔记之人机用户界面
  7. 一个Demo让你掌握所有的android控件
  8. Android(安卓)系统广播Action一览验证
  9. Android(安卓)AOSP输入法(LatinIME)大写判断分析

随机推荐

  1. Android调试神器stetho使用详解和改造
  2. 【Android Developer Blog】Android Stud
  3. Android高手进阶教程(五)之----Android
  4. android 组件
  5. android音乐播放器开发_开篇
  6. android ui显示技巧和注意事项
  7. 关于android的各种disk images(看过的讲a
  8. Eclipse中使用Ant打Android包报错解决方
  9. android平台的几个编译命令----make,mmm,
  10. Android:背景渐变色