在工具栏溢出菜单中显示菜单项图标时,如何发生这种奇怪的情况?

wqy*_*csu 9 android menu toolbar

我想在工具栏中显示溢出菜单(AppCompat-v7:22.1.1),下面是我的menu_main.xml.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
    android:id="@+id/action_search"
    android:title="@string/action_search"
    android:icon="@mipmap/ic_menu_search"
    android:orderInCategory="100"
    android:actionViewClass="android.widget.SearchView"
    app:showAsAction="ifRoom"/>

<item
    android:id="@+id/menu_group_chat"
    android:title="@string/menu_group_chat"
    android:icon="@mipmap/ic_menu_groupchat" />

<item
    android:id="@+id/menu_add_friend"
    android:title="@string/menu_add_friend"
    android:icon="@mipmap/ic_menu_add_friend" />
Run Code Online (Sandbox Code Playgroud)

运行我的应用程序后,菜单项的图标没有显示,然后我尝试了这个解决方案,在我的Activty中添加了一个覆盖方法onMenuOpened()(从AppCompatActivity扩展),

@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    if(menu!=null){
        if(menu.getClass().getSimpleName().equals("MenuBuilder")){
            try {
                Method m = menu.getClass().getDeclaredMethod(
                        "setOptionalIconsVisible", Boolean.TYPE);
                m.setAccessible(true);
                m.invoke(menu, true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return super.onMenuOpened(featureId, menu);
}
Run Code Online (Sandbox Code Playgroud)

但在运行此演示后,我发现图标仍未显示.

1.单击溢出按钮的菜单

从这个报道的问题,我知道在22.x中不再调用AppCompatActivity.onMenuOpened,但奇怪的是当我点击Genymotion中的硬件菜单键时,菜单出现在底部并带有图标,

2.单击菜单键的菜单

关闭菜单后,我再次单击工具栏中的溢出按钮,菜单中出现这些图标,

3.单击溢出按钮的菜单

多奇怪啊!为什么会这样?

Alé*_*lho 26

对于AppCompactActivity,您可以将此检查放在onPrepareOptionsPanel()上.

@Override
protected boolean onPrepareOptionsPanel(View view, Menu menu) {
        if (menu != null) {
            if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
                try {
                    Method m = menu.getClass().getDeclaredMethod(
                            "setOptionalIconsVisible", Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, true);
                } catch (Exception e) {
                    Log.e(getClass().getSimpleName(), "onMenuOpened...unable to set icons for overflow menu", e);
                }
            }
        }
    return super.onPrepareOptionsPanel(view, menu);
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该被接受作为答案. (2认同)