如何在 Android 菜单 xml 的多个菜单中包含一个通用菜单项?

Posted

技术标签:

【中文标题】如何在 Android 菜单 xml 的多个菜单中包含一个通用菜单项?【英文标题】:How to include a common menu item in multiple menus in Android menu xml? 【发布时间】:2011-05-19 05:34:41 【问题描述】:

许多菜单总是有一个相同的项目。

有没有办法将该项目定义为额外菜单并将其包含在所有其他菜单中?

类似这样的:

菜单/main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_main"
          android:title="@string/text_mainmenu" />
</menu>

菜单/other.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      parent="@menu/main">
    <item android:id="@+id/menu_other"
          android:title="@string/text_othermenu" />
</menu>

我知道,可以通过编程方式进行,但我认为 xml-way 更好。

【问题讨论】:

【参考方案1】:

膨胀每个菜单并调用 super 效果很好! 这是一个例子:

@Override
public boolean onCreateOptionsMenu(Menu menu) 

    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.main, menu);
    getMenuInflater().inflate(R.menu.other, menu);
    return true;

如果 super 还通过在其他膨胀之前/之后调用它来添加更多项目,您可以控制顺序,或者根本不调用它以忽略这些项目。

【讨论】:

对我来说也很好用——在我的情况下,我将 super 放在 onCreateOptionsMenu() 的末尾,以便“不同”菜单选项显示在菜单顶部而不是底部。 使用 android:orderInCategory 有一个明确的项目顺序,它独立于膨胀顺序。 非常有帮助。此功能的另一种用法是让 Activity B 扩展 Activity A —— 每个都有自己的菜单。在这种情况下,Activity B 将拥有其菜单定义的菜单选项与 Activity A 使用的菜单定义的菜单选项。 太棒了,有人真的举了一个例子,这么多的 android 菜单示例,所有这些似乎都是super() clear() inflate(),这违背了拥有对象层次结构的目的。【参考方案2】:

AFAIK,&lt;include&gt; 仅适用于布局 XML,不适用于菜单 XML,尽管您当然可以尝试一下。缺少这一点,编程选项(膨胀两个菜单 XML 文件)是我知道的唯一选项。

【讨论】:

正如我写的关于编程方式的内容,我的意思有点不同,但后来我看到,我可以在我的活动中为每个单独的菜单充气,从而从一些菜单石创建自定义菜单。谢谢你让我想到这个主意。 @Tima Genius!没想过膨胀多个菜单 XML。话虽如此,我觉得奇怪的是 includemerge 仅在布局中受支持,但是,嘿,我知道什么。 小代码示例可能很好,我不会经常看到在没有 clear() 的情况下在给定菜单上多次发生膨胀。

以上是关于如何在 Android 菜单 xml 的多个菜单中包含一个通用菜单项?的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义下拉菜单/弹出菜单

Android:菜单中的圆角

如何在Android中将菜单设置为工具栏

如何在 Android 4.2 中更改操作栏选项菜单的背景颜色?

如何在代码中将子菜单项添加到 ActionBar 操作?

如何在 AppCompatActivity 中显示带有图标和文本的菜单项