【问题标题】:icon in menu not showing in android菜单中的图标未在android中显示
【发布时间】:2013-11-03 07:06:19
【问题描述】:

我想将菜单处理程序添加到我的项目中。我也读过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>

【问题讨论】:

标签: android


【解决方案1】:

经过长时间的尝试,我发现以下解决方案可能有助于其他人节省时间。基本上,“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;
}

【讨论】:

  • 唯一真正可行的解决方案,但您需要添加@SuppressLint("RestrictedApi")
  • 说真的,唯一真正有效的解决方案。是的,不要忘记将 @SuppressLint("RestrictedApi") 放在方法 public boolean onCreateOptionsMenu(Menu menu)
  • 太棒了!兄弟,你真的节省了我的时间。
  • 现在,至少对于 Android kotlin,方法名称似乎是 setForceShowIcon()。
【解决方案2】:

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

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

【讨论】:

  • 但我运行 androidhive.info/2011/09/how-to-create-android-menus 并且它的工作,
  • 您的活动是否会在 ActionBarActivity 不起作用时扩展?
  • 两个版本的目标 API 是什么?相同?您是否针对相同的 API 级别进行构建?
  • 不,你说得对,我的 api 版本是 4.1,而我的示例使用的是 3 的低版本
  • 默认是不显示,但现在可以显示了。请参阅 Pranob 的回答。
【解决方案3】:

无论系统做出何种设计选择,您都可以使用the top upvoted answer to this question中提供的解决方案来规避这一点

为了完整起见,下面的代码。在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);
}

【讨论】:

  • 这几乎对我有用。由于我不明白的原因,featureId 值对我来说是 0。我用“if(featureId == Window.FEATURE_OPTIONS_PANEL && menu != null){”替换了第一个 if 语句,它起作用了。虽然,我不确定“FEATURE_OPTION_PANEL”是我的应用程序获得的 0 的正确含义。
  • 好吧,Android 臭名昭著的嵌入式“最佳实践”(也就是在开发人员 API 上拉苹果)的大多数 Java 变通方法都依赖于 Java 反射或直接源代码 copypasta 来进行项目(这远没有那么吸引人,但更安全)。举个例子,使用前者的人觉得有必要过度适应变化。在这种情况下,仲裁裁决是针对 ActionBar 调用的调整,但可能还有其他有效的,例如您的,具体取决于 API 级别和其他情况
  • 由于我的 featureId 是 108 而不是 8,我可以替换 featureId == Window.FEATURE_ACTION_BAR -> (featureId &amp; Window.FEATURE_ACTION_BAR) == Window.FEATURE_ACTION_BAR
  • 在那里并没有真正得到单个&符号 (&) 的用法,但正如我之前所说的那样,您可以在任何活动上尝试此 onMenuOpened 覆盖,即使没有第一个 if() 检查是否功能存在(当然,您仍然可以检查菜单!= null),并查看在您的情况下是否需要跨设备/SDK 的行为。+
  • 谢谢!我使用了您的代码,但将 featureId == Window.FEATURE_ACTION_BAR 替换为 (featureId & Window.FEATURE_ACTION_BAR) == Window.FEATURE_ACTION_BAR。 @leRobot:stackoverflow.com/questions/4757447/… 解释了 & 符号的工作原理和方式,一旦你读到了,你就会同意这里的用法非常聪明:)
【解决方案4】:

老问题,但希望对某人有所帮助。

使用以下代码:

<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

【讨论】:

  • 这是我需要做的。谢谢。
【解决方案5】:

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

请注意,它将是而不是菜单中的文本。

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

【讨论】:

    【解决方案6】:
    /* 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;
            }
    

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      • 这只是让它作为操作项出现在实际栏(而不是菜单中)。
      【解决方案8】:

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

      for (int i = 0; i

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

      } }

      【讨论】:

        【解决方案9】:

        使用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);
        }
        

        【讨论】:

          【解决方案10】:

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

          app:showAsAction="always
          

          【讨论】:

            【解决方案11】:
            @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"/>
            

            【讨论】:

              猜你喜欢
              • 2017-08-14
              • 2014-02-23
              • 1970-01-01
              • 1970-01-01
              • 2016-12-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-06-21
              相关资源
              最近更新 更多