菜单中的图标在android中不显示

菜单中的图标在android中不显示,android,Android,我想将菜单处理程序添加到我的项目中。我也读了,它很简单,但图标没有显示。我很困惑。我甚至以编程方式添加了一个菜单项 我的代码是: @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 0, 0, "Quit").setIcon(R.drawable.ic_launcher); getMenuInflater().inflate(R.layout.menu, menu); return t

我想将菜单处理程序添加到我的项目中。我也读了,它很简单,但图标没有显示。我很困惑。我甚至以编程方式添加了一个菜单项

我的代码是:

@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 3.0+上运行代码,则菜单中的图标不会按设计显示。这是谷歌的设计决定


您可以在Android开发者博客上了解更多信息。

您可以将item元素中的属性
Android:showAsAction=“always”
添加到XML文件中。然后,它将在操作栏中以图标的形式显示相关的菜单选项

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


要进一步阅读,请查看android:showAsAction下的内容。

无论系统在何处做出了何种设计选择,您都可以使用中提供的解决方案来规避此问题

代码如下,以确保完整性。在
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);
}
和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>



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

旧问题,但希望它能帮助其他人

使用以下代码:

<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

,经过长时间的尝试,我找到了下面的解决方案,可能有助于其他人节省时间。基本上,“lbarbosa”提供的解决方案,我要衷心感谢他

在前面的答案的基础上尝试了这一点,效果很好,至少在最新版本的支持库(25.1)中是如此:

/*菜单代码*/
/*Java代码*/
@SuppressLint(“RestrictedApi”)
@凌驾
公共布尔onCreateOptions菜单(菜单)
{
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。我的菜单,菜单);
if(菜单生成器的菜单实例){
MenuBuilder m=(MenuBuilder)菜单;
m、 SetOptionalConsVisible(真);
}
返回true;
}

使用android.support.v7.app.AppCompatActivity使图标的输入变得非常困难。您需要实现
onMenuOpen
,来自
AppComactActivity
类的超级方法。检查后,如果菜单不为空。如果菜单不是空的,则使用布尔值将如下方法类和
setoptionaliconvisible
传递为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);
}

只需在menu.xml中添加这个attr-inside-item标记

app:showAsAction="always

我使用下面的代码将显式图标放在onCreateOptions菜单方法中

对于(int i=0;i }

}

您的设备运行的是哪一个android版本?4.1.2,但我运行,而且运行起来很好这绝对是android最令人沮丧的问题之一。我不知道为什么它不起作用。他们的文档和你做的完全一样,但不起作用。您好,在androidhive演示中,它显示了低于3.0的版本。如果您在3.0更低的版本2.2、2.3等中运行程序,它将起作用。它说图标不受支持或其他什么,但我运行了,它工作正常,您的活动在不工作时是否扩展了
ActionBarActivity
?两个版本中的目标API是什么?相同的?你是在同一个API级别上构建的吗?不,你是对的,我的API版本是4.1,我使用的示例是3的较低版本。默认设置是不显示它们,但现在你可以显示它们。看Pranob的回答。这几乎对我有效。出于我不理解的原因,featureId值对我来说是0。我用“if(featureId==Window.FEATURE\u OPTIONS\u PANEL&&menu!=null){”替换了第一个if语句,它成功了。尽管我不确定“FEATURE\u OPTION\u PANEL”是否是我的应用程序所获得的0的正确含义。好吧,大多数Java变通方法都适用于Android臭名昭著的嵌入式“最佳实践”(又称开发者API上的苹果)依靠Java反射或直接的源代码复制到项目中(这远没有吸引力,但更安全)例如,使用前一种方法的人会觉得有必要对更改进行过度调整。在这种情况下,仲裁认为调整是针对ActionBar调用的,但可能会有其他有效的调整,例如您的调整,这取决于API级别等等。由于我的featureId是108而不是8,我可以替换
featureId==Window.FEATURE\u ACTION\B吗AR
->
(featureId&Window.FEATURE\u ACTION\u BAR)=Window.FEATURE\u ACTION\u BAR
并没有真正的单符号(&)用法,但正如我前面所说的,您可以在任何活动上尝试此OnMenuOpen覆盖,即使没有第一个检查功能是否存在的if()(您仍然可以检查菜单!=当然为null),并查看在您的情况下,跨设备/SDK的行为是否可取。+谢谢!我使用了您的代码,但将featureId==Window.FEATURE\u ACTION\u BAR替换为(featureId&Window.FEATURE\u ACTION\u BAR)==Window.FEATURE\u ACTION\u BAR.@leRobot:解释了符号是如何工作的以及为什么工作的,一旦你读到它,你就会同意这里的用法非常聪明:)这只是使它作为一个动作项出现在实际的栏上(而不是菜单中)。这是我需要做的。谢谢。这是唯一真正可行的解决方案,但你需要添加
@SuppressLint(“RestrictedApi”)
严肃地说,伙计们,这是唯一真正可行的解决方案。是的,别忘了在方法public boolean oncreateoptions Menu(Menu Menu)上加上@SuppressLint(“RestrictedApi”)太好了!兄弟,你真的节省了我的时间。现在,至少对Android kotlin来说,方法名似乎是setForceShowIcon()。
/* 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;
        }
@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);
}
app:showAsAction="always
        if (item.getItemId() == R.id.print) {
            item.setIcon(getDrawable(R.drawable.print));