43

我想将菜单处理程序添加到我的项目中。我也阅读了http://developer.android.com/guide/topics/ui/menus.html,它非常简单,但没有显示图标。我很迷茫。我什至以编程方式添加了一个菜单项。

我的代码是:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, 0, 0, "Quit").setIcon(R.drawable.ic_launcher);
    getMenuInflater().inflate(R.layout.menu, menu);
    return true;
}

在xml中:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Single menu item 
         Set id, icon and Title for each menu item 
    -->
    <item android:id="@+id/menu_bookmark" 
          android:icon="@drawable/update"
          android:title="@string/Update" />

</menu>
4

11 回答 11

44

经过长时间的尝试,我发现以下解决方案可能会帮助其他人节省时间。基本上,“lbarbosa”提供的解决方案,我衷心感谢他。

根据先前的答案进行了尝试,并且效果很好,至少对于支持库的更新版本(25.1):

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);

    if(menu instanceof MenuBuilder){
        MenuBuilder m = (MenuBuilder) menu;
        m.setOptionalIconsVisible(true);
    }

    return true;
}
于 2017-02-23T12:07:17.660 回答
36

如果您在 Android 3.0+ 上运行代码,则菜单中的图标不会按设计显示。这是谷歌的设计决定。

您可以在 Android 开发者博客上阅读更多相关信息

于 2013-11-03T07:18:04.170 回答
28

无论系统做出何种设计选择,您都可以使用该问题的最高投票答案中提供的解决方案来规避这一点

为了完整性,下面的代码。测试工作android.support.v7.app.ActionBarActivity

@Override
public boolean onMenuOpened(int featureId, Menu menu)
{
    if(featureId == Window.FEATURE_ACTION_BAR && 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(NoSuchMethodException e){
                Log.e(TAG, "onMenuOpened", e);
            }
            catch(Exception e){
                throw new RuntimeException(e);
            }
        }
    }
    return super.onMenuOpened(featureId, menu);
}
于 2014-03-26T17:27:46.703 回答
19

老问题,但希望它会帮助别人。

使用以下代码:

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

<item android:id="@+id/menu_item_share"
    android:title="Share"
    app:showAsAction="always"
    android:icon="@drawable/share" /></menu>

注意我用app:showAsAction而不是android:showAsAction

于 2016-11-04T13:51:20.373 回答
6

您可以将android:showAsAction="always"item 元素内的属性添加到 XML 文件中。然后,它会将相关菜单选项显示为操作栏中的图标。

请注意,它将代替菜单中的文本。

如需进一步阅读,请android:showAsAction下查看。

于 2014-01-06T10:01:28.377 回答
2
/* menu code */   
    <?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/one" android:title="one"
            android:icon="@mipmap/ic_launcher" app:showAsAction="always" />
        <item android:id="@+id/two" android:title="two"
            android:icon="@mipmap/ic_launcher" app:showAsAction="always" />
        <item android:id="@+id/three" android:title="three"
            android:icon="@mipmap/ic_launcher"  />
    </menu>
   /* Java code */

    @SuppressLint("RestrictedApi")
        @Override
        public boolean onCreateOptionsMenu(Menu menu)
        {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.mymenu,menu);
            if(menu instanceof MenuBuilder){
                MenuBuilder m = (MenuBuilder) menu;
                m.setOptionalIconsVisible(true);
            }
            return true;
        }
于 2018-09-20T18:51:49.050 回答
1

忘记所有这些,做这一步。添加app:showsAsAction="always"到您的项目。如果您使用 android:showsAsAction="always",您将无法获得解决方案。尝试将应用属性添加到您的项目。

于 2016-08-09T06:10:54.850 回答
1

我使用下面的代码在 onCreateOptionsMenu 方法中放置了明确的图标

for (int i = 0; i < menu.size(); i++) { MenuItem item = menu.getItem(i);

        if (item.getItemId() == R.id.print) {
            item.setIcon(getDrawable(R.drawable.print));

} }

于 2020-06-11T02:01:30.300 回答
0

使用android.support.v7.app.AppCompatActivity, 使图标的输入成为一项非常困难的任务。您需要实现类onMenuOpen中的超级方法AppComactActivity。在此检查之后,如果菜单不为空。如果菜单不为空,则通过这样的方法类并setOptionalIconsVisible使用布尔值设置为 true。

@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(NoSuchMethodException e){
                Log.e("MAIN", "onMenuOpened", e);
            }
            catch(Exception e){
                throw new RuntimeException(e);
            }
        }
    }
    return super.onMenuOpened(featureId, menu);
}
于 2018-10-17T12:07:26.727 回答
0

只需在 menu.xml 中的 item 标记内添加这个 attr

app:showAsAction="always
于 2019-08-23T02:46:19.173 回答
-2
@Override
public boolean onCreateOptionsMenu(Menu menu) {
  menu.add(0, 0, 0, "androidDemo").setIcon(R.drawable.ic_launcher);
  getMenuInflater().inflate(R.layout.menu, menu);
  return true;
}

在xml中:

 <item android:id="@+id/menuUpdate"
  android:icon="@drawable/update_icon"
  android:title="@string/Update" 
  android:showAsAction="always"/>

于 2014-07-08T09:36:01.850 回答