Android 智能键盘






4.83/5 (6投票s)
学习如何将软键盘变成智能键盘,使其在 Android 应用中对用户更具响应性和更高的生产力。
引言
Android 系统支持通过屏幕软键盘或硬件键盘对文本字段进行键盘输入。为了提升用户体验 (UX),你的应用必须针对这两种情况进行优化。
每个文本字段根据其用途,期望特定类型的文本输入,例如电子邮件、电话号码或纯文本。如果你的应用能在文本字段获得焦点时,自动显示与该文本字段预期用途最匹配的软键盘组合类型,那将是极佳的用户体验。此外,你的应用应通过拼写建议和新句子首字母自动大写等功能为用户提供输入辅助。是的,Android 的“EditText”控件具有这些功能,但你需要知道如何配置它们才能使其正常工作。让我们来了解一下……
指定键盘类型
创建一个 Android 项目,命名为“KeyboardActivity”,其布局文件为“activity_keyboard.xml”,其中包含一个“EditText”控件。“activity_keyboard.xml”的内容如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="16dp" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="16dp" tools:context="com.peterleowblog.androidux.KeyboardActivity"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="62dp" android:hint="Text Field" /> </RelativeLayout>
在 AVD 上启动应用,点击“EditText”文本字段将激活纯文本软键盘,如图 1 所示。

正如你在图 1 中看到的,纯文本是“EditText”控件的默认输入类型。让我们探索其他输入类型。
在“activity_keyboard.xml”中,向“<EditText>”节点添加 `android:inputType="textEmailAddress"` 属性,如下所示:
android:inputType="textEmailAddress"
重新启动应用,导航到“KeyboardActivity”页面,然后再次点击“EditText”文本字段。你将看到一个略有不同的软键盘,其中包含一个“@”键,如图 2 所示。显然,这个“@”键是为了方便输入电子邮件地址。

在“activity_keyboard.xml”中,将“<EditText>”节点的“android:inputType”属性值更改为“number”,如下所示:
android:inputType="number"
重新启动应用,导航到“KeyboardActivity”页面,然后再次点击“EditText”文本字段。你将看到一个软数字键盘,如图 3 所示。

回归基础
你刚刚发现,“EditText”控件的“android:inputType”属性可用于指示 Android 系统期望的文本输入类型,然后系统会提供最佳匹配的软键盘供使用。在此类用途中,一些更常见的输入类型值包括:
- “text“,这是默认值,表示普通文本键盘。
- “textEmailAddress“,表示包含“@”键的普通文本键盘。
- “number“,表示基本的数字键盘。
- “phone“,表示电话拨号盘。
此外,“android:inputType”属性还可以定义其他键盘行为,例如在你输入时建议单词列表、屏蔽密码文本、允许多行输入或大写新句子,以及更多。其中一些输入类型包括:
- “textPassword”,表示普通文本键盘,但会屏蔽输入的文本。
- “textMultiLine”,表示允许用户输入包含换行符的长文本的普通文本键盘。
- “textCapSentences”,表示大写每个新句子首字母的普通文本键盘。
- “textAutoCorrect”,表示提供帮助单词来纠正常见拼写错误的普通文本键盘。
你可以使用“|“分隔符为“EditText”控件的“android:inputType”属性指定多个输入类型。更改“activity_keyboard.xml”中“EditText”的“android:inputType”属性,如下所示,然后重新在 AVD 上启动它。
android:inputType="textMultiLine|textCapSentences"
你将看到一个纯文本软键盘。当你输入时,它会大写每个新句子,并在按下“回车键”时换行,如图 4 所示。

家庭作业
你应该通过修改代码来尝试各种输入类型,并在 AVD 上观察结果。
指定键盘操作按钮
你可能已经注意到,软键盘在右下角始终提供一个适合当前文本字段的操作按钮。默认情况下,此按钮对于单行文本字段执行“Next”或“Done”操作,或者对于多行文本字段充当“回车键”。但是,你可以选择为其分配不同的操作以满足你的需求。这是通过更改“EditText”控件的“android:imeOptions“属性的值来实现的。但是,要使其生效,你还必须包含“android:inputType”属性。请注意,这不适用于仅接受“回车键”作为其操作按钮的多行输入类型。让我们尝试一个例子……
在“activity_keyboard.xml”中,向“<EditText>”节点添加一个名为“android:imeOptions”的新属性,值为“actionSend”,并 साथ ही `android:inputType="text"`,如下所示:
android:inputType="text" android:imeOptions="actionSend"
在 AVD 上启动此页面,注意操作按钮将呈现为发送图标,如图 5 所示。

家庭作业
除了“actionSend”之外,还有其他“android:imeOptions“值,例如“actionGo”, “actionSearch”,“actionPrevious”, “actionNext”等等,你可以从中选择来定制你的键盘操作按钮。请访问“android:imeOptions“查看值的完整列表,并在你的代码中尝试它们,并在 AVD 上观察结果。
响应键盘操作按钮
要按下键盘操作按钮时执行操作,你需要向“EditText”控件注册一个“TextView.OnEditorActionListener“实例,并实现其“onEditorAction()”方法,以响应由“EditorInfo“类中定义的“actionId”标识的操作按钮,例如“actionSearch”在“android:imeOptions“中的“IME_ACTION_SEARCH”。让我们尝试一个例子:
在“activity_keyboard.xml”中,将值“actionSearch”分配给“<EditText>”节点的“android:imeOptions”,如下所示:
android:imeOptions="actionSearch"
将必要的包导入到“KeyboardActivity.java”中,如下所示:
import android.view.KeyEvent; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast;
最后,在“KeyboardActivity.java”的“onCreate()”方法中添加以下代码,以响应键盘操作按钮:
final EditText editText = (EditText) findViewById(R.id.editText); editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { boolean handled = false; if (actionId == EditorInfo.IME_ACTION_SEARCH) { Toast.makeText(getApplicationContext(), "Searching for " + editText.getText(), Toast.LENGTH_SHORT).show(); handled = true; } return handled; } });
在 AVD 上启动此页面。点击“EditText”字段会弹出软键盘,键盘操作按钮显示为发送图标。按下此按钮将触发“onEditorAction()”方法,该方法仅回显一条消息,如图 6 所示。

家庭作业
尝试修改“onEditorAction()”方法以处理不同的键盘操作按钮,并在 AVD 上观察结果。
其他事项
通常,软键盘仅在文本字段获得焦点时(即点击它时)才会出现。如果你希望在活动加载时软键盘自动出现怎么办?为此,你必须在项目“AndroidManifest.xml”文件中为活动添加一个名为 `android:windowSoftInputMode="stateVisible"` 的属性。例如:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.peterleowblog.androidux" > <application ...> <activity <!-- other activitiy --> </activity> <activity android:name=".KeyboardActivity" android:windowSoftInputMode="stateVisible"> <!-- ... --> </activity> </application> <!-- other declarations --> </manifest>
从现在起,每当加载“KeyboardActivity”页面时,软键盘都会自动出现。但是,这可能会导致问题。我们来看看……
在“activity_keyboard.xml”中添加以下代码,在屏幕底部附近添加一个“Button”控件:
<!-- ..... --> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="85dp" /> </RelativeLayout>
你期望看到如图 7 所示的屏幕:

不,你不会。这是因为每当页面加载时,按钮都会被自动出现的软键盘隐藏起来。你可能希望在软键盘出现时将其移到软键盘的上方。可以做到吗?
是的,你可以兼得!只需将“adjustResize”添加到“android:windowSoftInputMode”,如下所示:
android:windowSoftInputMode="stateVisible|adjustResize"
眼见为实。(图 8)

你的愿望实现了。你可以参考“android:windowSoftInputMode“了解更多选项。
摘要
为了克服任何 Android 设备上的屏幕尺寸限制,我们将不得不为用户提供最适合他们预期输入的键盘类型。诸如自动更正之类的额外帮助将受到用户的极大赞赏。将智能键盘集成到你的应用中是提高小型屏幕设备上键盘输入生产力和效率的保证方法。
这篇文章 Android Smart Keyboard 最先出现在 Peter Leow's Code Blog。