Android imeOptions、imeActionId和imeActionLabel的行为
我对Android本机开发还很陌生,我正试图找出如何定制IME操作按钮。我看过谷歌的文档,但是我能找到很少关于预期行为的信息 从中,我了解到可以使用以下属性配置键盘操作按钮:Android imeOptions、imeActionId和imeActionLabel的行为,android,android-input-method,Android,Android Input Method,我对Android本机开发还很陌生,我正试图找出如何定制IME操作按钮。我看过谷歌的文档,但是我能找到很少关于预期行为的信息 从中,我了解到可以使用以下属性配置键盘操作按钮: <EditText ... android:imeOptions="actionGo" android:imeActionLabel="Custom" android:imeActionId="666" android:inputType
<EditText
...
android:imeOptions="actionGo"
android:imeActionLabel="Custom"
android:imeActionId="666"
android:inputType="text"/>
- android:imeOptions可以将空格键附近显示的按钮的文本/id设置为一些预定义值(例如,actionGo将键标签设置为Go,将id设置为2)
- android:imeActionLabel当键盘全屏时,通常在横向模式下,设置输入区域内显示的按钮标签。可以设置为任何字符串值
- android:imeActionId与前面相同,但设置传递给回调方法的数字Id
<EditText
...
android:imeOptions="actionGo"
android:imeActionLabel="Custom"
android:imeActionId="666"
android:inputType="text"/>
我已经检查了纵向和横向模式下不同API级别的效果。以下是结果
API等级15-4.0.3
在纵向模式下,键标签为Go,传递给回调方法的操作id为2,与imeOptions设置相对应
在横向模式下,键标签/id为Go/2,作为纵向模式,而输入区域中显示的按钮为Custom/666,与imeActionLabel和imeActionId属性相对应
API等级16、17和18-4.1.2、4.2.2和4.3
在纵向和横向模式下,按键和按钮均显示自定义标签,并绑定到666 id,忽略imeOptions属性
这种行为的不匹配非常令人讨厌,因为:
- API级别>=16时,您无法区分按键按钮和输入区按钮
- API级别=15时,您不能为键按钮设置任何自定义文本
多谢各位 只需在java代码中以编程方式调用
.setImeActionLabel()
,即可将actionID(再次)设置为所需的ID
editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);
实际上,由输入法应用程序,而不是Android框架本身来决定如何处理您设置的值 Android框架只是将您设置的值传递给输入法,然后输入法可以选择要在键盘上显示的按钮或全屏视图中的“提取的”
EditText
。Android框架通过两种方式影响编辑信息:-
- 它将其传递,以确保其中的值在键盘和应用程序的
s之间兼容。目前,这只影响一些targetAPI版本
值,而不影响编辑器操作,但如果引入新的编辑器操作(或全新设置),这可能会改变InputType
- 它设置输入法的默认行为,包括全屏编辑器的行为。如果输入法选择不覆盖这个默认行为,那么它可能会导致不同Android版本的行为不同。许多键盘确实选择设置自己的行为,在Android版本之间保持一致
因此,说某个
EditorInfo
字段对任何给定的版本都有一定的影响并不是那么简单,即使在一个Android版本上,也无法确保一致的行为。您所做的只是向输入法提供提示,输入法选择如何向用户显示这些提示。如果有人正在为Android设计自定义键盘,并且Enter键的标签有问题,您应该执行以下操作。在Android自定义键盘示例中,我们在SoftKeyboard.java中有以下方法:
@Override
public void onStartInput(EditorInfo attribute, boolean restarting)
{
super.onStartInput(attribute, restarting);
.
. // the implementation
.
mCurKeyboard.setImeOptions(getResources(), attribute.imeOptions);
}
将最后一行更改为下一行:
mCurKeyboard.setImeOptions(getResources(), attribute);
现在在LatinKeyboard.java中更改setImeOptions方法,如下面所示:
void setImeOptions(Resources res, EditorInfo ei)
{
if (mEnterKey == null)
{
return;
}
switch (ei.imeOptions & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION))
{
case EditorInfo.IME_ACTION_SEND:
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = res.getText(R.string.label_send_key);
break;
case EditorInfo.IME_ACTION_GO:
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = res.getText(R.string.label_go_key);
break;
case EditorInfo.IME_ACTION_NEXT:
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = res.getText(R.string.label_next_key);
break;
case EditorInfo.IME_ACTION_SEARCH:
mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_search);
mEnterKey.label = null;
break;
default:
mEnterKey.iconPreview = null;
mEnterKey.label = res.getText(R.string.label_enter_key);
mEnterKey.icon = null;
break;
}
if (ei.actionLabel != null)
{
mEnterKey.iconPreview = null;
mEnterKey.icon = null;
mEnterKey.label = ei.actionLabel;
}
}
现在,您的自定义键盘根据imeActionLabel的xml文件中定义的内容显示正确的标签。当您启动一个新的Android项目时,它为您的问题提供了一个很好的提示。有一个名为
LoginActivity
的活动,您可以将其创建为默认登录屏幕。此活动将生成一个EditText
,如下所示:
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/prompt_password"
android:imeActionId="@+id/login"
android:imeActionLabel="@string/action_sign_in_short"
android:imeOptions="actionUnspecified"
android:inputType="textPassword"
android:maxLines="1"
android:singleLine="true"/>
注意我们如何在这里定位
imeActionId
。这是另一种在活动中针对EditText
的方法,同时还可以灵活地更改键盘输入的操作。因此,这就是为什么尽管我更改了标签,并且在“onEditorAction”中收到了id,但仍然显示“OK”的原因与我在xml中设置的id不同?我不知道为什么你的应用程序会以特定的方式运行。听起来你们需要问这个问题。但你们的第一句话在这里很清楚。就我个人而言,这个标签被忽略了。在Nexus6模拟器上使用它。对我不起作用,标签没有改变,我在“onEditorAction”上也得到了一个不同的id