安卓开发

android输入法开发,学习android软件开发

原文来自Android Developer Guide,本文为原文翻译,如有错误,欢迎指出。

输入法(IME:Input method editor)是一个能够让用户输入文本的工具。Android提供了一个可扩展的输入法框架,允许应用为用户提供不同的输入法,比如触屏键盘甚至语音输入。只要安装,用户就可以从系统设置中选择自己喜欢使用的输入法,并且在整个系统环境中使用;在同一时刻,只有一种输入法可以使用。

要在Android系统中创建一个输入法,你创建的应用需要包含继承自InputMethodService的类。此外,通常还要创建一个”settings”的activity,用来向IME服务传递参数选项。你也可以自定义设置界面,把它作为系统设置的一部分。

输入法的生命周期在application manifest中声明IME组件输入法 API设计输入法的用户界面从输入法向应用程序发送文本创建不同类型的输入法如果你之前没有做过输入法的相关东西,你应该先阅读这篇介绍性的文章Onscreen Input Methods。此外,SDK中包含的Soft Keyboard sample app项目里面有样例代码,你可以修改它们,然后开始创建自己的输入法。

输入法的生命周期下图描述了一个输入法的生命周期:

Android输入法生命周期

接下来的部分描述了如何实现遵循这一生命周期,实现输入法代码和界面。

在application manifest中声明IME组件在Android系统中,输入法是一个包含指定的IME服务的Android应用,应用的mainifest文件必须声明此服务,请求所需的权限,提供和action.view.InputMethod匹配的intent filter,并且提供包含输入法一些参数的元数据。此外,若想提供一个允许用户修改输入法行为的设置界面,你要定义一个能从系统设置中启动的settingsactivity。

下面的代码声明了一个输入法的service.它请求了BIND_INPUT_METHOD 权限,来允许服务把IME和系统关联起来,创建一个intent filter来匹配android.view.InputMethod,并且定义了输入法的元数据。

下一个代码片段声明了输入法的设置activity.它包含了一个ACTION_MAIN的intent filter,表示此activity作为整个输入法应用的入口。

你也可以在输入法界面中直接提供用户设置。

输入法API输入法相关的类可以在android.inputmethodservice和android.view.inputmethodpackages中找到。 KeyEvent类在处理键盘字符中非常重要。

输入法的核心组件是一个服务,它是一个继承自InputmethodService的类。除了实现常规的输入法声明周期外,该类还包含了一些回调函数,用来给开发者处理输入法界面,处理用户输入,并将文本发送给当前正在处理的文本域。默认情况下,InputmethodService类提供了管理输入法状态、可视化以及和当前输入法框交互的大部分实现。

BaseInputConnection

定义了从输入法回到当前接收输入的应用之间的通信管道。你可以使用它来获取焦点所在位置周围的文本,向文本域提交文本以及向应哟功能程序发送原始的键盘事件。应用应该继承这个类而不要独自实现基础的InputConnection接口。

KeyboardView

继承自View,用来渲染绘制一个键盘,并且响应用户的输入事件。键盘的布局就是用一个Keyboard的实例来实现的,你可以通过创建一个xml文件来实现。

设计输入法的用户界面输入法中主要有两种可视化的元素:输入界面和候选界面。你只需要实现和你设计的输入法有关的界面。

输入界面输入法界面是用户输入文本的地方,可以是敲击键盘键位,手写,或者手势的形式。当输入法第一次调用显示的时候,系统会调用onCreateInputView()。在方法实现中,你可以创建想显示的布局,并将创建的布局实例返回给系统,下面的代码片段是一个实现onCreateInputView()方法的例子:

@Overridepublic View onCreateInputView() {MyKeyboardView inputView =(MyKeyboardView) getLayoutInflater().inflate( R.layout.input, null);inputView.setOnKeyboardActionListener(this);inputView.setKeyboard(mLatinKeyboard);return mInputView;}在这个例子中,MyKeyboardView是一个用来生成一个键盘的典型的例子.如果你要创建一个传统的QWERTY键盘,可以查看Soft Keyboard sample app作为一个如何继承KeyboardView类的样例。

候选界面候选界面是输入法为用户提示预测纠错和建议选词的地方。在输入法的生命周期中,当候选界面准备显示的时候,系统会调用OnCreateCandidateView(),你在实现此方法的时候,要返回用来显示建议词的界面,如果不想显示任何界面,就返回null。(此方法默认返回null,如果不希望显示就不必实现此方法)

关于实现给用户提供建议的例子,可以查看Soft Keyboard sample app。

界面设计要考虑的事情这部分介绍一些关于输入法界面设计的东西。

处理不同屏幕尺寸你的输入法界面必须能够适应不同的屏幕尺寸,并且可以处理横屏和竖屏。在非全屏输入模式中,给应用留有足够的空间来显示文本框以及相关的内容,所以输入法不能占用超过一半的屏幕空间。在全屏输入的模式中,这就不是问题了。

处理不同的输入类型Android中的文本域允许开发者指定一个具体的输入类型,比如自由格式的文本,数字,URL,邮箱地址和查询字符串等。当你实现一个新的输入法的时候,你需要去检测每一个输入域的类型,并且为他提供合适的输入法实例。当然,你不需要去检测用户输入的数据在特定的输入类型中的合理性,那是应用的开发者的责任。

例如,这里有一些Android系统提供的拉丁键盘的在处理文本和电话号码输入界面的截图

当一个输入域得到输入焦点并且启动你的输入法的时候,系统会调用onStartInputView(),并且传入一个EditorInfo对象参数,里面包含了关于输入类型和其他文本域属性的细节,在这个对象中,inputType字段包含了文本域的输入类型。

inputType字段是一个整型变量,它包含了基于位的规则表示各种各样的输入类型设置。若需要用它来检测不同的输入类型,用它和常量TYPE_MASK_CLASS进行如下操作:

**inputType & InputType.TYPE_MASK_CLASS **

输入类型的位模式可以是下面多种值之一:

TYPE_CLASS_NUMBERA输入数字的区域,就像前面截图中展示的那样,拉丁键盘在这种输入模式下显示了一个数字面板。

TYPE_CLASS_DATETIMEA用于输入日期和时间的文本域。

TYPE_CLASS_PHONEA用于输入电话号码的文本域

TYPE_CLASS_TEXTA可以输入所有支持的字符的文本域。

这些常量在参考文档InputType中,有更加详细的描述。

输入类型还包括其他的数值,表示普通文本输入的变体,例如:

TYPE_TEXT_VARIATION_PASSWORDA用于输入密码的TYPE_CLASS_TEXT的变体,输入法会将输入的字符显示为圆点。

TYPE_TEXT_VARIATION_URIA用于输入URL和URI的TYPE_CLASS_TEXT变体。

TYPE_TEXT_FLAG_AUTO_COMPLETEA用于输入可以通过词典、查询或者其他组件自动完成的文本。

要用这些常量检查输入类型的时候,注意要用正确的

Similar Posts

发表评论

邮箱地址不会被公开。 必填项已用*标注