如何强制显示操作栏溢出图标

22

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

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

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


2
请注意,对于上下文菜单,溢出图标始终显示 - 上下文菜单没有溢出图标。用户一直在抱怨这个问题 - 不是所有用户都会抱怨这个问题。如果事情按照用户的期望方式工作,您不太可能得到积极的评论。我建议您阅读有关选择偏差的信息。数亿台Android设备具有MENU按钮(例如,大多数三星手机),用户似乎在没有问题的情况下使用这些设备。 - CommonsWare
2
正确:一些用户。但是,在屏幕顶部看到几个菜单选项,然后记得按下屏幕底部的菜单按钮查看更多内容是很尴尬的。将三点图标放在操作栏中会更加明显。至于上下文菜单,它绝对会出现;只需尝试向上下文菜单添加足够的项目,您就会看到它出现(至少适用于Android 4.0+)。 - Peri Hartman
关于上下文菜单,它确实会显示出来 -- 不,它不会。也许你在想上下文操作栏(又称为操作模式)。 - CommonsWare
2个回答

58

恭喜你!你赢了!

从Android 4.4开始,无论设备是否有物理MENU按钮,操作栏中的...提示都将存在。 Google目前的兼容性定义文件对于使用专用MENU按钮表达功能做出更强硬的反对。

开发人员过去使用的窍门是:

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及以下版本中仍然不会更改任何内容,因为我认为这是一个"打地鼠"的情况,您会用没有菜单的投诉来代替同一个菜单的重复版本的投诉。话虽如此,由于这是从现在开始正式支持的行为,我对开发人员在旧设备上追求一致性没有问题。

我提交的问题的评论者 致敬,他指出了这个变化。


谢谢。我找了很久,但从未遇到过这个。 - Peri Hartman
谷歌做得很棒。从我的经验来看,普通用户并不记得菜单按钮在哪里。特别是在三星设备上,当背光关闭时它几乎就看不见了。 - TheLettuceMaster
2
CommonsWare,您确定现在这是强制性的吗?我有一部装有KitKat 4.4.2的三星Galaxy 3,并且它已经在硬件上具有菜单按钮。应用程序不会自动在操作栏上显示“软”溢出按钮。我仍然需要反射并更改sHasPermanentMenuKey键。 - j2emanue
据我所知,兼容性定义文档条款仅适用于新设备,而不适用于现有设备的操作系统升级。即使适用,Google也可能会将具有MENU键的现有设备“纳入祖传”,以便在升级前后应用程序的行为保持一致。 - CommonsWare
1
@Rat-a-tat-a-tatRatatouille:嗯,既然那个字段是未记录的,很有可能是某个设备制造商将其删除了。这就是使用这种技术的问题所在,也是为什么我不建议使用它们的原因。 - CommonsWare
显示剩余3条评论

27

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

<?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,它不能在所有设备上运行,也不是可以期望在所有安卓设备上都能确保正常工作的东西。干得好,Rino,像这样的小细节比人们使用和理解更重要。 - thekevshow
谢谢@Rino。你的帖子正是我在寻找的。 - Mustafa Chelik
非常整洁清晰的解决方案。 只有一个问题,我们能否在menu_overflow的菜单中动态添加菜单项? - Bugs Happen
一个带有3个点的可绘制对象。这是从哪里来的?我们如何确保它看起来像默认的那一个? - BeniBela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接