Android下创建一个输入法
电脑输入法是一种能够让客户输入文字的控制。Android出示了一套可拓展的电脑输入法架构,促使应用软件能够让客户挑选多种类型的电脑输入法,例如根据触摸屏的数字键盘或是根据视频语音。当安裝了特殊电脑输入法以后,客户就可以在系统配置中挑选个电脑输入法,并在下面的键入情景中应用该电脑输入法。但是在任一時刻,只有应用一个电脑输入法。
为了更好地在安卓手机系统下建立一个电脑输入法,必须新创建一个包括拓展了InputMethodService类的安卓软件,并建立一个用以设定的activity,客户能够根据它将设定选择项发送给电脑输入法的service,因而,你要必须为该设定运用界定呈现、互动页面,用以表明和更改输入法设置。
本手册包括以下內容:
- IME的生命期
- 在应用软件的manifest中申明IME部件
- IME API
- 设计方案IME UI页面
- 将文字从电脑输入法传送给所属的应用软件
- 和IME subtypes配合工作
假如你以往沒有触碰过电脑输入法,提议读熟这篇导游词格式文章内容《OnscreenInputMethods》。在SDK中有一个电脑输入法方法SoftKeyboard可供参考。
电脑输入法的生命期
下面的图叙述了电脑输入法详细的生命期:
图1:电脑输入法的生命期
下面的章节目录将叙述怎样完成电脑输入法在生命期中每一个连接点的编号。
在Manifest中申明电脑输入法部件
在安卓手机系统中,电脑输入法是一个包括IME service的安卓软件程序流程。务必在该应用软件的manifest文档中申明service,要求必需的管理权限,出示可以配对action.view.InputMethod 的intent filter,出示界定电脑输入法特点的metadata。除此之外,也要出示一个能够用于改动电脑输入法主要参数的设定页面,根据系统配置能够运行该页面。
以下编码精彩片段界定了一个电脑输入法service:
<!-- 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>
第一行粗体字申明必须BIND_INPUT_METHOD管理权限来连接系统软件,第二行粗体字建立了一个可以配对android.view.InputMethod的intent filter,第三行粗体字界定了电脑输入法的metadata。
下面的编码精彩片段申明了电脑输入法的设定activity:
<!-- 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>
在其中的粗体字界定了一个可以配对ACTION_MAIN的intent filter,这说明该acitvity是电脑输入法运用的主通道。
还能够在这儿申明从UI浏览输入法设置的管理权限。
电脑输入法API
在android.inputmethodservice和android.view.inputmethod库中能够寻找电脑输入法有关的class。在其中KeyEvent 是解决标识符功能键的关键类。
电脑输入法的重要环节便是一个service部件,该部件拓展了InputMethodService。除开完成一般的service生命期之外,此类必须给UI层出示回调函数,用于解决客户键入,而且把文字传送给键入聚焦点。InputMethodService类完成了绝大多数管理方法电脑输入法情况、页面及其和当今文本框通讯的逻辑性。
下列class一样关键:
BaseInputConnection
界定了从电脑输入法到接受键入的应用软件中间的通讯安全通道。应用此类能够获得鼠标光标周边的文字,能够把字符串数组递交给输入框,还能够向应用软件推送原生态的功能键信息。应用软件应当拓展此类,而不必完成InputConnection。
KeyboardView
此类拓展了View使其可以展示出一个电脑键盘而且相对客户的键入事情。能够根据一个XML文档来界定键盘布局。
设计方案电脑输入法页面
电脑输入法有两个关键的由此可见的页面原素:键入窗和备选窗。你只必须完成和电脑输入法有关的页面原素就可以。
Input view
键入窗就是指客户根据功能键或笔写或手式立即造成的文字展现地区。当电脑输入法初次呈现时,系统进程onCreateInputView()回调函数。你需要在该方式中建立电脑输入法页面合理布局,并将该合理布局回到给系统软件。下边的编码精彩片段完成了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类。
Candidates view
备选窗用于呈现电脑输入法变换过的供客户挑选的备选字符串,系统软件将启用onCreateCandidatesView()使电脑输入法建立并展示出备选窗。你需要完成该方式,回到一套合理布局来呈现备选窗,当不用呈现备选窗时能够回到null。该方式默认设置便会回到null,因而假如你什么事都不做便会全都不呈现。
在SoftKeyboard方法中你能寻找备选窗完成的事例。
电脑输入法UI设计的考虑到
此章叙述电脑输入法中一些独特的UI设计。
解决不一样的显示屏尺寸
电脑输入法的UI务必可以解决不一样的显示屏尺寸,必须充分考虑显示屏的深度主视图。在非全屏幕方式下,电脑输入法务必为应用软件的文本框和有关前后文空出充足的室内空间,因而电脑输入法不可以占有超出一半的显示屏室内空间。全屏幕方式下则不会有这种难题。
解决不一样的键入种类
安卓系统的文本框容许你给他们设置键入种类,例如文字、数据、URL、email详细地址或是检索串。如果你完成了一个新的电脑输入法,你需要检测每一个文本框的键入种类,并为此出示配对的页面。自然,你不用检查用户输入文字的合理合法,它是应用软件的岗位职责。
比如,下边是电脑输入法为键入种类为文字和联系电话的文本框呈现的页面截屏:
图2
当某一键入控制接受到聚焦点,电脑输入法将被运行,系统软件会启用电脑输入法的onStartInputView(),并传进去一个EditorInfo目标,该目标包括键入种类和别的键入控制的有关特性,在其中inputType字段名用于表明当今键入控制的键入种类。
inputType字段名是一个整形美容数据信息,它是不一样的键入种类按位或出去的結果。能够应用掩码TYPE_MASK_CLASS来检验该字段名的值,如:
inputType & InputType.TYPE_MASK_CLASS
其結果很有可能包括以下值:
- TYPE_CLASS_NUMBER 当今键入控制只接纳数据。如前边上述,这时电脑输入法应当展示出数字键盘。
-
TYPE_CLASS_DATETIME 当今键入控制只接纳日期和時间。
-
TYPE_CLASS_PHONE 当今键入控制只接纳联系电话。
-
TYPE_CLASS_TEXT 当今键入控制接纳全部标识符。
在InputType的在线手册文本文档中能够寻找这种变量定义的详细说明。inputType字段名还能够包括别的的文字变异种类,比如:
- TYPE_TEXT_VARIATION_PASSWORD 表明当今的输入框是用以输入支付密码,这时电脑输入法应当呈现表明登陆密码的标记而不是具体文本。
-
TYPE_TEXT_VARIATION_URI 说明当今输入框是用以键入URL或是URI字符串。
-
TYPE_TEXT_FLAG_AUTO_COMPLETE 说明在当今输入框中输入文字时,应用软件会应用词典或百度搜索引擎或别的体制为其內容全自动补齐。
在检测这种变异的情况下要对inputType应用精确地长亮来做比较。在InputType的在线手册文本文档中能够寻找全部掩码变量定义的详细资料。
留意:在你的电脑输入法中,若想把标识符传送给登陆密码框时,一定要解决恰当:在你的键入窗和备选隔窗尽量不必显示密码串,电脑输入法也不要在机器设备中储存客户登陆密码。在《安全设计指南》中能够掌握到大量安全性议案。
把字符串数组发给应用软件
当客户应用电脑输入法键入标识符时,电脑输入法有二种方式能够将文字发给应用软件:一、向应用软件推送单独的电脑键盘事情;二、编写文本框中鼠标光标周边的文字。二种方法都必须应用一个InputConnection案例来传送字符串数组,启用InputMethodService.getCurrentInputConnection()就可以得到该案例。
编写鼠标光标周边的字符串数组
如果你对键入隔窗现有的字符串数组进行编写时,BaseInputConnection下的一些方式十分有效:
- getTextBeforeCursor() 回到一个CharSequence目标,该目标包括鼠标光标前特定数量的标识符。
-
getTextAfterCursor() 回到一个CharSequence目标,该目标包括鼠标光标后特定数量的标识符。
-
deleteSurroundingText() 删掉鼠标光标前后左右特定数量的标识符。
-
commitText() 把一个CharSequence目标递交给键入窗,并设定新的鼠标光标部位。
下边的精彩片段表明了如何用“Hello!”更换鼠标光标左边的四个标识符:
InputConnection ic = getCurrentInputConnection(); ic.deleteSurroundingText(4, 0); ic.commitText("Hello", 1); ic.commitText("!", 1);
在提交之前机构文字串
假如你的电脑输入法必须做预测分析或是要根据两步机构成象形字,你能先在文本框中表明当今的键入全过程,最终再把机构成的最后字符串递交给文本框,用这一最后字符串更换掉以前的全过程串。你能把正中间全过程串传送给setComposingText()涵数来呈现这一全过程。
下边的代码段用于表明怎样呈现这一全过程:
InputConnection ic = getCurrentInputConnection(); ic.setComposingText("Composi", 1); ... ic.setComposingText("Composin", 1); ... ic.commitText("Composing ", 1);
之上编码的实行实际效果呈现以下:
图3:上屏前的创作串
阻拦硬电脑键盘事情
虽然电脑输入法对话框沒有键入聚焦点,但它可以第一个得到硬键盘键位信息,而且挑选是不是吞掉它還是再次往下传送给应用软件。比如,当键盘按键按住时,你能在输入法备选窗户挪动聚焦点备选,并吞掉这一功能键信息;当退格键按住时,你能撤消电脑输入法对话框弹出来的一切键入窗或备选窗。
遮盖onKeyDown()和onKeyUp()方式能够阻拦硬电脑键盘事情。详细信息能够参照SoftKeyboard方法。
假如你不愿解决该功能键信息,还记得启用父类的super()方式。
建立电脑输入法的subtype
电脑输入法能够根据subtype来界定它所适用的多种多样键入方式和语言表达。一个subtype能够包括以下特性:
- 一种语言表达如en_US或fr_FR
- 一种键入方式如视频语音、电脑键盘或笔写
- 别的独特的键入设计风格、方式或特性,比如10键或qwerty合理布局。
键入方式能够是一切的键盘布局、语音录入这些方式。一个subtype能够是这种方式的组成。
电脑输入法能够在自身的挑选控制面板中载入subtype信息来转换不一样的subtype,一般 在系统软件状态栏和输入法设置页面中呈现该信息内容。系统软件架构还能够根据该信息内容立即建立出一个特定的电脑输入法subtype。如果你搭建一个电脑输入法时,应应用subtype作用,由于他能够协助客户区别和转换不一样的电脑输入法语言表达和方式。
能够再电脑输入法的XML資源文档中界定subtype,应用<subtype>根原素。下边的精彩片段界定了一款含有2个subtype的电脑输入法:一个是英文键盘,另一个是法语电脑键盘。
<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" ... /> />
为了更好地确保你的subtype在UI里能恰当地标识出去,要应用%s来获得subtype标识,这和获得subtype locale的方式一样。下面会用2个代码段来示范性,在其中第一段是电脑输入法的XML文档有关代码段:
<subtype android:label="@string/label_subtype_generic" android:imeSubtypeLocale="en_US" android:icon="@drawable/icon_en_us" android:imeSubtypeMode="keyboard" />
下一段是电脑输入法的strings.xml文件一部分,在其中的資源label_subtype_generic界定以下,它会被电脑输入法的UI页面应用:
<string name="label_subtype_generic">%s</string>
该设定能够使电脑输入法的subtype的姓名依照当地locale设定来表明。比如在英文locale下表明”English (United States)”
从系统软件状态栏中挑选电脑输入法的subtype
全部电脑输入法显现出的subtype会被安卓手机系统统一管理方法。一款电脑输入法的全部subtypes均归属于该电脑输入法。以下所显示,客户能够在系统软件状态栏中,挑选当今电脑输入法下任一能用的subtype:
图4:从状态栏中挑选电脑输入法subtype
图5:在系统配置控制面板中设定电脑输入法的subtype
从系统配置中挑选电脑输入法subtypes
客户能够在系统软件的“语言表达和键入”设定控制面板中设定怎么使用subtype。在SoftKeybaord方法的文档InputMethodSettingsFragment.java中包括了怎么使用subtype的完成编码,科学研究该方法能够掌握怎样在输入法中适用subtype的其他信息。
图6:挑选一个电脑输入法的语言表达
在输入法的subtype中转换
能够出示一些转换关键词,让客户更非常容易地在好几个电脑输入法subtype中间转换,这种关键词还可以是全局性的语言表达标志。那样能够巨大提高电脑键盘的易用性,处理客户插电。要想可以便捷的转换,必须进行以下流程:
1、在输入法的XML資源文档中申明supportsSwitchingToNextInputMethos=“true”,以下:
<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">
2、启用shouldOfferSwitchingToNextInputMethod()方式。
3、假如该方式回到true,则表明转换关键词。
4、当客户挑选了转换关键词后,启用switchToNextInputMeshod()方式,并在第二个主要参数中传到false。该false告知系统软件公平看待全部subtype,无论她们归属于哪一个电脑输入法。假如特定true,则规定系统软件在当今电脑输入法汽车内循环转换subtype。
留意:在Android5.0(API level 21)以前,switchToNextInputMethod()还不知道supportsSwithcingToNextInputMethod特性。假如客户转换到某一电脑输入法而沒有转换关键词,他可能获得不正确,并且很有可能没法随便地转换出来。
电脑输入法典型性难题考虑到
在你完成一款电脑输入法的情况下也有一些事必须考虑到:
- 从电脑输入法页面上出示给客户改动设定的通道。
- 由于系统软件里很有可能安裝了好几个电脑输入法,必须在输入法页面上出示能够转换到其他电脑输入法的通道。
- 要让电脑输入法页面尽量快的切出,尽量地预加载或是在后台管理载入规格很大的資源,便于客户点一下可键入输入框后马上切出来电脑输入法,要给資源或是主视图考虑到做缓存文件,以便后用。
- 当电脑输入法页面被掩藏后,应当尽早释放出来电脑输入法所占有的很大块的运行内存,便于应用软件一直有充足的运行内存能用。假如电脑输入法被掩藏了一段时间后,考虑到应用延迟时间信息来释放出来資源。
- 要保证客户能够键入在当今语言表达和locale下的尽量多的标识符。谨记客户很有可能会在登陆密码或登录名中应用标点符号,因此 电脑输入法务必出示尽量多的标识符以满足客户需求键入的必须。假如一些字符数不出来,会立即造成他很有可能无法打开某台机器设备。