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

Per*_*man 23 android android-actionbar

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

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

我意识到强制溢出图标出现在操作栏中会复制"物理"图标的功能.您可能会认为违反了Androids设计指南.但在我看来,用户赢了.他们说这令人困惑,我相信他们是对的.

Com*_*are 58

恭喜!你赢了!

从Android 4.4开始,无论设备是否具有物理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
}
Run Code Online (Sandbox Code Playgroud)

在Android 4.4+上不应该这样做,虽然有了异常处理程序,如果你运行它我不会指望任何特殊问题,并且总有一天它们会sHasPermanentMenuKey完全摆脱.

就我个人而言,我仍然不会改变Android 4.3及以下版本的内容,因为我怀疑这是一个非常糟糕的情况,你会更换关于没有菜单的抱怨,抱怨有相同菜单的重复版本.话虽如此,由于这是现在正式认可的行为,我对开发人员的目标是在旧设备上保持一致性没有任何问题.

在我就此提出的问题上评论者提供了一个帽子提示,指出了这一变化.

  • CommonsWare你确定现在这是强制性的吗?我有一个带有kitkat 4.4.2的三星galaxy 3,它已经在硬件中有一个菜单按钮.应用程序不会自动显示操作栏上的"软"溢出按钮.我仍然需要反思并更改sHasPermanentMenuKey键. (2认同)

Rin*_*ino 25

这可能是另一项工作,这真的帮助了我.保留一个可绘制的三个点,并将其作为菜单项.

<?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>
Run Code Online (Sandbox Code Playgroud)