actiongo - imeoptions android edittext




imeOptions,imeActionId和imeActionLabel的行为 (3)

我是Android原生开发的新手,我正在试图弄清楚如何自定义IME动作按钮。 我查看了Google文档,但我发现很少有关于预期行为的信息。

官方指南中我了解到可以使用以下属性配置键盘操作按钮:

  • 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(再次)设置为您想要的。

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

如果有人正在为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方法,如bellow:

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的Activity,您可以将其创建为默认登录屏幕。 此Activity将生成一个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"/>

现在,如果您阅读documentation ,您就会知道imeOptions属性允许您为文本字段指定其他操作。 例如,弹出的键盘在右下角有一个动作,如“下一步”。 使用imeOptions您可以从Android提供的预定义列表中选择其他操作。 您可以指定类似“actionSend”或“actionSearch”的内容。

一旦这样做,按照Activity的顺序,您可以使用setOnEditorActionListener事件处理程序监听该操作:

    mPasswordView = (EditText) findViewById(R.id.password);
    mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
            if (id == R.id.login || id == EditorInfo.IME_NULL) {
                attemptLogin();
                return true;
            }
            return false;
        }
    });

请注意我们如何在这里定位imeActionId 。 这是另一种在Activity中定位EditText方法,同时还可以灵活地更改键盘输入上的操作。





android-input-method