溢出菜单图标未显示

Overflow menu icon is not showing

在下面的menu.xml中,我试图在溢出菜单图标中显示menu_exit,所以如下图我设置了它的showAsAction="never",但是当我运行 应用程序,溢出菜单未显示。

我的问题是:

  1. 如何在溢出菜单中放置 menu.xml menu_exit 的最后一项?
  2. menu.xml中的第3项,当它被禁用时,显示在settings menu(设备左下角的按钮)中,而我想要的是,当它被禁用时它不应出现在任何地方,仅在启用时出现在 ActionBar 上。

menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item
    android:id="@+id/menu_refresh"
    android:orderInCategory="1"
    android:showAsAction="ifRoom"/>
<item
    android:id="@+id/menu_scan"
    android:checkable="true"
    android:orderInCategory="2"
    android:title="@string/menu_scan"
    android:showAsAction="ifRoom|withText"/>
<item
    android:id="@+id/menu_stop"
    android:title="@string/menu_stop"
    android:orderInCategory="3"
    android:showAsAction="ifRoom|withText"/>
<item
    android:id="@+id/menu_exit"
    android:title="@string/menu_stop"
    android:orderInCategory="4"
    android:showAsAction="never"/>
</menu>

这是我的 XML 菜单文件..

<item
    android:id="@+id/action_send_feedback"
    android:orderInCategory="100"
    android:showAsAction="always"
    android:title="@string/action_send_feedback"/>

<item 
    android:id="@+id/action_share_app"
    android:orderInCategory="100"
    android:showAsAction="ifRoom"
    android:title="@string/action_share_app"
    android:icon="@drawable/ic_action_share" />

<item
    android:id="@+id/action_rate_app"
    android:orderInCategory="100"
    android:showAsAction="never"
    android:title="@string/action_rate_app"/>

Java代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

对于 android phone 具有选项按钮(在 phone 的底部)的菜单项 showAsAction="never" 当按钮是按下..否则它们将正常显示在操作栏选项菜单上..

如果您正在使用 appcompat 库,则需要更改

android:showAsAction="never"

app:showAsAction="never"

示例

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
    android:id="@+id/action_view_contact"
    app:showAsAction="always|withText"
    android:icon="@drawable/ic_action_person"
    android:title="@string/action_view_contact" />
<item
    android:id="@+id/action_save_contact"
    app:showAsAction="always|withText"
    android:icon="@drawable/ic_action_add_person"
    android:title="@string/action_save_contact" />

<item
    android:id="@+id/action_change_notification"
    app:showAsAction="never|withText"
    android:title="@string/action_turn_off_notifications" />

注意:这个答案现在已经过时了。

tnx @gMale 突出显示以下内容:

Caution: Using reflection to read this field will now throw an exception when targeting API 31 and above.

原回答:

在 Android 4.4 之前,如果设备有硬件菜单按钮,操作溢出菜单会通过硬件按钮激活并且不会显示溢出(又名三点)图标。

Android 4.4+ 设备将显示操作溢出图标,即使存在硬件菜单按钮(而且,Google 试图说服制造商放弃硬件菜单按钮,如您所见,供应商很固执)

要强制 4.4 之前的设备显示动作溢出按钮,即使它们有硬件按钮,请将其放入 activity 的 onCreate()

try {
    ViewConfiguration config = ViewConfiguration.get(this);
    Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
    if (menuKeyField != null) {
        menuKeyField.setAccessible(true);
        menuKeyField.setBoolean(config, false);
    }
} catch (Exception ex) {
    // Ignore
}

this post之后,出现带有以下代码的图标:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    if (menu is MenuBuilder) (menu as MenuBuilder).setOptionalIconsVisible(true)
    menuInflater.inflate(R.menu.simple_menu, menu)
    return true
}

注意:有一个 lint 警告,表明这是一个受限制的 API,只能在内部使用。 . .但它有效。