志在指尖
用双手敲打未来

Android输入法开发

输入法修改器(IME)是一个便于用户输入文本的控件。Android供给了一个可扩展的输入法结构,允许运用程序供给可替代的输入法,比如屏幕上的键盘或许语音输入。在装置输入法后,用户能够经过体系选项挑选想要运用的输入法。
想要添加一个输入法,你需求创立一个Android运用并包括一个承继自InputMethodService的类。此外,同城创立一个设置页面来承载输入发的各个选项。你能够自行界说一个设置的UI。
下面叙述以下几个内容:
输入法的生命周期
在运用的清单文件中界说输入法组件
输入法相关接口
规划一个款输入法的UI
发送文本到运用
输入法子类型的运用
一、输入法的生命周期
输入法的生命周期如下图所示:

二、在清单文件中界说输入法组件
在Android体系中,IME是一个包括特别IME服务的运用程序。运用的清单文件有必要声明输入法服务,请求有必要的权限,供给一个intentfilter来匹配action.view.InputMethod,并供给界说了IME特征的元数据(metadata)。此外,能够界说一个设置页面来供给用户修改IME配置的接口,它能够被体系设置所发动。
下面的代码片段声明晰一个IME服务。请求了BIND_INPUT_METHOD权限来允许服务连接到体系的IME,树立intentfilter和metadata:
<serviceandroid:name=”FastInputIME”android:label=”@string/fast_input_label”android:permission=”android.permission.BIND_INPUT_METHOD”><intent-filter><actionandroid:name=”android.view.InputMethod”/>intent-filter><meta-dataandroid:name=”android.view.im”android:resource=”@xml/method”/>service>
下面的代码片段声明晰IME的设置页面,它拥有ACTION_MAIN的intentfilter来表明它是IME程序的主进口
<activityandroid:name=”FastInputIMESettings”android:label=”@string/fast_input_settings”><intent-filter><actionandroid:name=”android.intent.action.MAIN”/>intent-filter>activity>
也能够从IME的UI供给直接进入设置的进口。
三、输入法API
与IME相关的类在android.inputmethodservice和android.view.inputmethod包中。KeyEvent类关于处理键盘特征至关重要。
IME的核心部分是一个服务组件,即一个承继自InputMethodService的类。此外为了完结一般服务的生命周期,这个类供给了IME的UI,处理用户输入和传输文本到指定区域以及当时焦点的回调。InputMethodService类供给了绝大多数办理IME状况和与当时输入区域交互的完结。
下面几个类也很重要。
BaseInputConnection
界说了输入法和运用之间接纳输入的交互通道。运用它来读取光标周围的文本,提交文本到输入框以及发送键盘事情给运用。运用应该集成此类。
KeyboardView
一个View的扩展,描绘了一个键盘和用户输入事情的呼应。键盘的布局是被Keyboard的实例指定,能够界说一个XML文件。
四、规划输入法UI
IME有两个主要的视觉元素:即输入视图和备选视图。你只需求完结和你规划的输入法有关的元素。
4.1输入视图
输入视图是用户运用按键,手写或许手势在表单中输入文本的UI。
当IME第一次显现,体系会调用onCreateInputView()回调。在你完结的这个办法中,你创立你想要的IME窗口的布局并回来给体系。下面片段是一个比如:
@OverridepublicViewonCreateInputView(){
MyKeyboardViewinputView=
(MyKeyboardView)getLayoutInflater().inflate(R.layout.input,null);
inputView.setOnKeyboardActionListener(this);
inputView.setKeyboard(mLatinKeyboard);returnmInputView;
}
这儿的MyKeyboardView是一个自界说的完结了KeyboardView的实例,假如你构建的是一个传统的QWERTY键盘,请检查KeyboardView类。
4.2.候选视图
候选视图是供用户挑选可选词和推荐词的视图。在IME的生命周期中,体系在准备好显现备选视图的时分会调用onCreateCandidatesView()。在你完结的这个办法中,回来显现词汇主张的布局,当什么都不显现时,回来null。
若要检查完结用户主张词汇的比如,请检查SoftKeyboard示例运用。
4.3.UI规划依据
此部分介绍了一些IME的UI规划思想。
·应对多元化的屏幕尺度
你的IME的UI有必要能够适配不同屏幕的尺度,且有必要处理竖屏和横屏两种方向。在非全屏方式下,为运用程序留出足够的空间以显现文本字段和任何相相关的上下文,使得IME不会占用屏幕一半以上的空间。在全屏方式下没有这个问题。
·处理不同的输入类型
Android的输入框允许你挑选一个特别的输入类型,比如自由文本,数字,网址,邮箱地址,收索内容等。当你完结一个新的IME,您需求检测每个字段的输入类型,并为其供给恰当的接口。但是,你不必设置IME以检查用户输入的文本对输入类型有效;这是拥有文本字段的运用程序的责任。
当输入字段接纳焦点并且您的IME发动时,体系调用onStartInputView(),传递一个EditorInfo目标,该目标包括有关文本字段的输入类型和其他特点的详细信息。在此目标中,inputType字段包括文本字段的输入类型。
输入类型字段是一个包括用于各种输入类型设置的位方式的int参数。要测验它的文本字段的输入类型,用常量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_CLASS_TEXT的变体。输入法将显现标记,而不是实际文本。
TYPE_TEXT_VARIATION_URI
用于输入网址和其他一致资源标识符(URI)的TYPE_CLASS_TEXT的变体。
TYPE_TEXT_FLAG_AUTO_COMPLETE
TYPE_CLASS_TEXT的变体,用于输入运用程序从字典,搜索或其他东西中“主动完结”的文本。
记住在测验这些变量时,用恰当的常数掩蔽输入类型。可用的掩码常数在输入类型的参阅文档中列出。
留意:在您自己的IME中,确保在将其发送到暗码字段时正确处理文本。在输入视图和候选视图中的用户界面中躲藏暗码。还要记住,您不应该在设备上存储暗码。要了解更多信息,请参阅“为安全性规划”指南。
五、向运用程序发送文本
当用户运用IME输入文本时,您能够经过发送单个键事情或在运用程序的文本字段中修改光标周围的文本来向运用程序发送文本。在任一情况下,您都运用InputConnection的实例来传递文本。要获取此实例,请调用InputMethodService.getCurrentInputConnection()。
5.1.修改光标周围的文本
当处理文本字段中现有文本的修改时,BaseInputConnection中一些更有用的办法是:
getTextBeforeCursor()
回来包括当时光标方位之前的请求字符数的CharSequence。
getTextAfterCursor()
回来包括当时光标方位后的请求字符数的CharSequence。
deleteSurroundingText()
删除当时光标方位前后的指定数量的字符。
commitText()
向文本字段提交CharSequence并设置新的光标方位。
例如,以下代码段显现怎么运用文本“Hello!”替换光标左边的四个字符:
InputConnectionic=getCurrentInputConnection();
ic.deleteSurroundingText(4,0);
ic.commitText(“Hello”,1);
ic.commitText(“!”,1);
5.2.在提交之前编撰文本
假如您的IME履行文本预测或需求多个过程来组成字形或单词,则能够在文本字段中显现进展,直到用户提交单词,然后您能够用完结的文本替换部分组合。当你传递给setComposingText()时,你能够经过添加一个“span”来对文本进行特别处理。
以下代码段显现了怎么在文本字段中显现进展
2.在提交之前编撰文本
假如您的IME履行文本预测或需求多个过程来组成字形或单词,则能够在文本字段中显现进展,直到用户提交单词,然后您能够用完结的文本替换部分组合。当你传递给setComposingText()时,你能够经过添加一个“span”来对文本进行特别处理。
以下代码段显现了怎么在文本字段中显现进展
以下屏幕截图显现了用户看到的页面:
WX20181023-195324@2x.png
5.3.阻拦硬件按键事情
即便输入法窗口没有清晰的焦点,它首要接纳硬件键事情,并且能够挑选运用它们或将它们转发到运用程序。例如,您或许想要运用方向键在UI中导航以在组合期间挑选候选项。您或许还想捕获回来键以封闭源自输入法窗口的任何弹出窗口。
要阻拦硬件键,重写onKeyDown()和onKeyUp()。请参阅SoftKeyboard示例运用程序的示例。
记住要为你不想处理的键调用super()办法。
六、创立IME子类型
子类型允许IME揭露IME支撑的多种输入方式和语言。子类型能够表明:
·区域设置,如en_US或fr_FR
·输入方式,如语音,键盘或手写
·IME特有的其他输入样式,表单或特点,例如10键或qwerty键盘布局。
基本上,方式能够是比如“键盘”,“语音”等的任何文本。子类型还能够暴露这些的组合。
子类型信息用于IME切换器对话框,该对话框可从告诉栏和IME设置中运用。该信息还允许结构直接引出IME的特定子类型。当构建IME时,运用子类型东西,由于它有助于用户识别和在不同的IME语言和方式之间切换。
您能够运用元素在输入法的XML资源文件之一中界说子类型。以下代码段界说了一个具有两个子类型的IME:美国英语语言环境的键盘子类型,法国的法语语言环境的另一个键盘子类型
“http://schemas.android.com/apk/res/android”android:settingsActivity=”com.example.softkeyboard.Settings”android:icon=”@drawable/ime_icon””@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”/>
“@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”/>
“@string/display_name_german_keyboard_ime”…
/>
/>
6.1.从告诉栏中挑选TIME子类型
Android体系办理一切IME揭露的一切子类型。IME子类型被视为它们所属的IME的方式。在告诉栏中,用户能够为当时设置的IME挑选可用的子类型,如以下屏幕截图所示:
20170206171319355.png
20170206171330099.png
6.2.从体系设置挑选IME子类型
用户能够在“体系设置”区域的“语言和输入”设置面板中操控子类型的运用方法。在SoftKeyboard示例运用程序中,文件InputMethodSettingsFragment.java包括一个在IME设置中完结子类型启用程序的完结。有关怎么在IME中支撑输入法子类型的更多信息,请参阅AndroidSDK中的SoftKeyboard示例运用程序。
20170206171422115.png
6.3.在IME子类型之间切换
您能够允许用户经过供给切换键(如球形语言图标)作为键盘的一部分,在多个IME子类型之间轻松切换。这样做大大提高了键盘的可用性,并能够协助避免用户的绝望。要启用此类切换,请履行以下过程:
(1).在输入法的XML资源文件中声明supportsSwitchingToNextInputMethod=“true”。您的声明应类似于以下代码段:
<input-methodxmlns: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).当用户点击切换键时,调用switchToNextInputMethod(),将false传递给第二个参数。值false表明体系平等对待一切子类型,而不管它们属于什么IME。指定true要求体系在当时IME中循环遍历子类型。
留意:在Android5.0(API级别21)之前,switchToNextInputMethod()不知道supportsSwitchingToNextInputMethod特点。假如用户切换到IME而没有切换键,他或许会卡在该IME中,无法轻松地切换出来。
七、一般IME留意事项
以下是您完结IME时需求考虑的其他事项:
·为用户供给一种直接从IME的UI设置选项的办法。
·由于设备上能够装置多个IME,所以供给了用于用户从输入法UI直接切换到不同的IME的方法。
·快速发动IME的UI。根据需求预加载或加载任何大型资源,以便用户在点击文本字段时看到IME。缓存资源和视图,用于后续调用输入法。
·相反,您应该在躲藏输入法窗口后当即开释大量内存分配,以便运用程序能够有足够的内存来运行。假如IME处于躲藏状况几秒钟,请考虑运用延迟消息来开释资源。
·请确保用户能够为与IME相关的语言或区域设置输入尽或许多的字符。请记住,用户能够在暗码或用户名中运用标点符号,因而您的IME有必要供给许多不同的字符,以允许用户输入暗码并拜访设备。
作者:凯玲之恋
链接:https://www.jianshu.com/p/4e0075effa69
来历:简书
简书著作权归作者一切,任何方式的转载都请联系作者获得授权并注明出处。

未经允许不得转载:IT技术网站 » Android输入法开发
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载