首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >imeOptions、imeActionId和imeActionLabel的行为

imeOptions、imeActionId和imeActionLabel的行为
EN

Stack Overflow用户
提问于 2013-11-03 14:15:46
回答 4查看 47.1K关注 0票数 48

我对Android本机开发非常陌生,我正在努力研究如何定制IME操作按钮。我看过Google文档,但是我发现很少有关于预期行为的信息。

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

  • android:imeOptions可以将显示在空格键附近的按钮的文本/ id设置为一些预定义的值(例如,actionGo将键标签设置为Go,id设置为2)。
  • 当键盘是全屏时,android:imeActionLabel设置显示在输入区域内的按钮的标签,通常是在横向模式下。可以设置为任何字符串值。
  • android:imeActionId与前面相同,但设置传递给回调方法的数字Id

但是经过一些经验性的尝试,我发现API级别15和下一个API级别之间存在不同的行为。

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

代码语言:javascript
复制
<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作为纵向模式,而输入区域中显示的按钮为Custom666,相应地对应于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的设置中遗漏了一些东西,可以证明不同的行为.

非常感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-08 11:41:37

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

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

  • 它通过EditorInfo.makeCompatible来确保键盘和应用程序的targetApiVersion之间的值是兼容的。目前,这只会影响一些InputType值,而不会影响编辑器操作,但如果引入新的编辑器操作(或全新的设置),这可能会发生改变。
  • 它为输入方法设置默认行为,包括围绕全屏编辑器的行为。如果输入方法选择不覆盖这种默认行为,那么最终可能会出现Android版本之间不同的行为。许多键盘确实选择了自己的行为方式,在Android版本之间是一致的。

因此,要说一个特定的EditorInfo字段对任何给定的版本都有一定的影响并不是那么简单,而且即使在一个Android版本上,也无法确保一致的行为。您所做的只是为输入方法提供提示,该方法选择如何将它们呈现给用户。

票数 12
EN

Stack Overflow用户

发布于 2014-03-21 02:43:06

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

代码语言:javascript
复制
editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);
票数 10
EN

Stack Overflow用户

发布于 2017-03-08 21:59:04

当您启动一个新的Android项目时,它为您的问题提供了一个很好的提示。有一个名为LoginActivity的活动,您可以创建它作为默认登录屏幕。此活动将生成一个EditText,如下所示:

代码语言:javascript
复制
            <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"/>

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

一旦您这样做,为了您的活动,您可以使用setOnEditorActionListener事件处理程序侦听该操作:

代码语言:javascript
复制
    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的。这是在您的活动中以EditText为目标的另一种方法,同时也具有更改键盘输入上的操作的灵活性。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19753910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档