输入法API
有IME的类可以在android.inputmethodservice和android.view.inputmethod包中找到。KeyEvent类对于处理键盘字符至关重要。
IME的核心部分是服务组件,它继承InputMethodService类。除了实现了标准的服务生命周期,这个类还给IME的UI提供了回调方法,用于处理用户的输入,并且把文本发送给当前具有输入焦点的文本域。默认情况下,InputMethodService类提供了用于管理IME状态和可见性的大多数实现,并且跟当前的输入域进行通信。
下面的类也很重要:
BaseInputConnection
这个类定义InputMethod类跟接收它输入的应用程序之间的通信通道。使用这个通道来读取光标范围内的文本,把文本提交给文本框,以及把原始的按键事件发送给应用程序。应用程序应该继承这个类,而不是实现基本接口:InputConnection。
KeyboardView
这个类是View类的一个子类,它展现一个软键盘,并响应用户输入的事件。该软键盘 的布局是由一个Keyboard类的实例来指定的,你可以在XML文件中定义它的布局。
设计输入法的UI
对于IME来说,有两个主要的可视元素:input view和candidates view。你只需要实现那些跟你所设计的输入法相关的元素。
Input view
Input view是用户点击键盘、手写或使用手势输入文本的UI。当IME首次显示的时候,系统会调用它的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软键盘,请看软键盘的示例程序:sample app,看。它是如何继承KeyboardView类的。
Candidates View
Candidates View是用户选择候选字的地方。在IME生命周期中,在准备显示Candidate View的时候,系统会调用它的onCreateCandidatesView()回调方法。在这个方法的实现中,它会返回一个建议候选字的布局,如果没有要显示的内容,它会返回null(如果你提供候选建议,那么你就不必实现这个方法,因为null响应是默认的行为)。
UI设计要考虑的因素
接下来介绍以下设计IME的UI时要特别考虑的一些因素:
1. 处理多种屏幕尺寸
你的IME的UI必须能够根据不同的屏幕尺寸来进行缩放,并且也必须处理横竖屏的差异。在非全屏的IME模式中,要给你的应用程序留有足够的显示文本域和对应内容的空间,IME所占用的屏幕空间不应该超过半屏。在全屏的IME模式中,这就不是一个问题,
2. 处理不同的输入类型
Android的文本域允许你给它设置特殊的输入类型,如文本、数字、URL、Email地址和搜索字符串等。当你实现一个新的IME时,你需要检查每个输入域的输入类型,并提供相应的UI界面。这样你就不必检查用户键入的文本是否是有效的输入类型,因为应用程序的文本域自己会负责这件事情。
例如,以下拉丁语IME的界面截图分别提供了文本和电话号码的输入:
图2.拉丁语IME输入类型
当一个输入域接收到焦点并且IME启动时,系统会调用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_CLASS_TEXT类型的变体,用于输入密码。输入法会用修饰符号来代替实际文本的显示。
TYPE_TEXT_VARIATION_URI
它是TYPE_CLASS_TEXT类型的变体,用于输入网址和其他类型的URI。
TYPE_TEXT_FLAG_AUTO_COMPLETE
它是TYPE_CLASS_TEXT类型的变体,用于输入应用程序从字典、搜索或其他便利的地方获取的自动完成的文本。
警告:在你自己的IME中,当你把文本发送给密码文本域时,要确保正确的处理这些文本,因为在Input View 和Candidates View的UI中密码都是要隐藏的。还要记住不应该把密码保存在设备上。