【问题标题】:How to force action bar overflow icon to show如何强制显示操作栏溢出图标
【发布时间】:2013-12-25 00:37:27
【问题描述】:

我想强制溢出图标始终显示在操作栏中(假设有溢出项)。在带有菜单按钮的型号上,有时溢出图标不会出现,用户必须点击设备菜单按钮才能获得其余的操作菜单项。用户不断抱怨这一点。

请注意,对于上下文菜单,溢出图标始终显示,无论设备是否具有内置菜单按钮。

我意识到强制溢出图标出现在操作栏中会复制“物理”图标的功能。您可能会认为这违反了 Android 设计准则。不过,在我看来,用户赢了。他们说这令人困惑,我相信他们是对的。

【问题讨论】:

  • “请注意,对于上下文菜单,溢出图标始终显示”——上下文菜单没有溢出图标。 “用户一直在抱怨这个”——不,一些用户抱怨这个。对于按用户期望的方式工作的事情,您不太可能得到积极的评价。我建议您阅读selection bias。数以亿计的 Android 设备都有 MENU 按钮(例如,大多数三星手机),用户似乎可以毫无问题地使用这些设备。
  • 正确:一些用户。但是在屏幕顶部看到几个菜单选项很尴尬,并且必须记住按下屏幕底部的菜单按钮才能看到更多。将三点图标放在操作栏中使其更加明显。至于上下文菜单,它绝对会出现;只需尝试在上下文菜单中添加足够的项目,您就会看到它出现(至少对于 android 4.0+)。
  • “至于上下文菜单,它绝对会出现”——不,不会。也许您正在考虑上下文操作栏(也称为操作模式)。

标签: android android-actionbar


【解决方案1】:

恭喜!你赢了!

从 Android 4.4 开始,无论设备是否具有物理 MENU 按钮,操作栏中的 ... 提示都将出现。 Google 当前的 Compatibility Definition Document 现在更强烈地反对拥有专用的 MENU 按钮。

开发人员过去为了获得这种行为而使用的 hack 是:

try {
  ViewConfiguration config = ViewConfiguration.get(this);
  Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");

  if (menuKeyField != null) {
    menuKeyField.setAccessible(true);
    menuKeyField.setBoolean(config, false);
  }
}
catch (Exception e) {
  // presumably, not relevant
}

这在 Android 4.4+ 上应该不需要,尽管有了异常处理程序,如果您运行它,我预计不会出现任何特殊问题,并且有一天,他们会彻底摆脱 sHasPermanentMenuKey

就我个人而言,我仍然不会在 Android 4.3 及更低版本上进行更改,因为我怀疑这是一种“打地鼠”的情况,在这种情况下,您将用抱怨有相同菜单的重复版本来代替没有菜单的抱怨。话虽如此,由于这是官方认可的未来行为,我对开发人员在旧设备上的一致性没有意见。

the commenter on the issue I filed 致敬,指出变化。

【讨论】:

  • 谢谢。我四处张望,但从未遇到过。
  • Google 在这方面做得非常出色。根据我的经验,普通用户不记得菜单按钮在那里。尤其是在三星设备中,当背光关闭时,它看起来是不可见的。
  • CommonsWare 你确定这是强制性的吗?我有一个带有 kitkat 4.4.2 的三星 Galaxy 3,它的硬件中已经有一个菜单按钮。这些应用程序不会在操作栏上自动显示“软”溢出按钮。我仍然必须反思并更改 sHasPermanentMenuKey 键。
  • @j2emanue:AFAIK,兼容性定义文档条款仅适用于新设备,不适用于现有设备的操作系统升级。而且,即使是这样,谷歌也有可能“继承”现有设备的 MENU 键来获取更新,以使应用程序在升级前后表现相同。
  • @Rat-a-tat-a-tatRatatouille:好吧,由于该字段未记录在案,因此完全有可能某些设备制造商将其删除。这就是此类技术的问题所在,也是我不推荐它们的原因。
【解决方案2】:

这可能是另一种解决方法,这对我很有帮助。保留一个带有三个点的可绘制对象,并将其作为菜单项。

<?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:app="http://schemas.android.com/apk/res-auto">


<item
    android:id="@+id/saveDetails"
    app:showAsAction="always"
    android:title="@string/save"/>

<item
    android:id="@+id/menu_overflow"
    android:icon="@drawable/dts"
    android:orderInCategory="11111"
    app:showAsAction="always">
    <menu>
        <item
            android:id="@+id/contacts"
            app:showAsAction="never"
            android:title="Contacts"/>


        <item
            android:id="@+id/service_Tasks"
            app:showAsAction="never"
            android:title="Service Tasks"/>


        <item
            android:id="@+id/charge_summary"
            app:showAsAction="never"
            android:title="Charge Summary"/>


        <item
            android:id="@+id/capture_signature"
            app:showAsAction="never"
            android:title="Capture Signature"/>
    </menu>
</item>

</menu>

【讨论】:

  • 这是一个更好更优雅的解决方案,所有设备都支持。前面的评论是一个糟糕的 hack,它不能在所有设备上运行,也不能指望所有 Android 设备都可以肯定地工作。干得好里诺,像这样的小事比人们使用和理解要重要得多。
  • 谢谢@Rino。您的帖子正是我要搜索的内容。
  • 非常简洁明了的解决方案。只是一个问题,我们可以在那个menu_overflow的菜单中动态添加菜单项吗??
  • "一个 3 点可绘制"。那是从哪里来的?我们如何确定它看起来像默认的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多