如何在Android menu xml中将常见菜单项包含在多个菜单中?

36

许多菜单始终有一个相同的项目。

是否有一种方法将该项目定义为额外菜单,并将其包含在所有其他菜单中?

类似于此:

menu/main.xml

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

菜单/其他.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的方式更好。

2个回答

71

将每个菜单展开并调用super函数非常好!以下是一个示例:

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.main, menu);
    getMenuInflater().inflate(R.menu.other, menu);
    return true;
}

如果超类还添加了更多的项,您可以通过在其它充气之前或之后调用它来控制顺序,或者根本不调用它以忽略这些项。


1
对我来说也很好用 - 在我的情况下,我将super放在onCreateOptionsMenu()的末尾,这样“不同”的菜单选项就会显示在菜单顶部而不是底部。 - George
6
使用android:orderInCategory可以对项目进行显式排序,这与充气顺序是独立的。 - Bananeweizen
非常有用。这种能力的另一种用法是让Activity B扩展Activity A - 每个活动都有自己的菜单。在这种情况下,Activity B将具有其菜单定义的菜单选项以及Activity A使用的菜单定义的菜单选项。 - dazed
1
太棒了,有人提供了一个做这个的示例。许多Android菜单示例似乎都使用了super() clear() inflate(),这样做没有利用好对象结构的目的。 - ebyrob

13
AFAIK,<include> 只适用于布局 XML,而不是菜单 XML,尽管你可以尝试一下。如果不行,我知道的唯一选择是通过编程方式同时解析两个菜单 XML 文件。

3
当我提到编程方式时,我的意思稍有不同,但后来我发现可以膨胀活动中的每个单独菜单,从某些菜单基础上创建自定义菜单。感谢你给我带来这个想法。 - Tima
1
@Tima Genius!没有想到可以填充多个菜单XML文件。话虽如此,我认为“包含”和“合并”只支持布局是很奇怪的,但嘿,我知道什么呢。 - Joshua Pinter
一个小的代码示例可能很好,我很少看到在没有clear()的情况下在给定菜单上发生多次inflate。 - ebyrob
@ebyrob,通常由于某种原因,共享的代码示例很少。至少在这些旧的Android开发问题中是如此。 - lasec0203

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接