Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android imeOptions、imeActionId和imeActionLabel的行为_Android_Android Input Method - Fatal编程技术网

Android imeOptions、imeActionId和imeActionLabel的行为

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

我对Android本机开发还很陌生,我正试图找出如何定制IME操作按钮。我看过谷歌的文档,但是我能找到很少关于预期行为的信息

从中,我了解到可以使用以下属性配置键盘操作按钮:

<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
但经过一些经验尝试,我发现API级别15和下一个API级别之间的行为有所不同

我已使用以下属性设置了一个简单的EditText元素:

<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时,您不能为键按钮设置任何自定义文本
您知道如何在API 15和16+中获得此信息吗? 或者,是否有一种方法可以在所有(或至少部分)API版本中获得一致的行为

也许我在IME设置中遗漏了一些可以证明不同行为的东西


多谢各位

只需在java代码中以编程方式调用
.setImeActionLabel()
,即可将actionID(再次)设置为所需的ID

editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);

实际上,由输入法应用程序,而不是Android框架本身来决定如何处理您设置的值

Android框架只是将您设置的值传递给输入法,然后输入法可以选择要在键盘上显示的按钮或全屏视图中的“提取的”
EditText
。Android框架通过两种方式影响编辑信息:-

  • 它将其传递,以确保其中的值在键盘和应用程序的
    targetAPI版本
    s之间兼容。目前,这只影响一些
    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