安卓:如何包括另一个菜单XML中的菜单XML?(Android: How to include a

2019-09-19 09:09发布

简单的问题。

我有我的子项的菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/fp_pitcher"
        android:title="Pitcher">
    </item>
    <item
        android:id="@+id/fp_catcher"
        android:title="Catcher">
    </item>
<!-- SNIP ---> 
</menu>

而后来我想将它作为这个菜单的子菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >


    <item
        android:id="@+id/teameditor_remove"
        android:title="Remove Player from Team">
    </item>

    <item
        android:id="@+id/teameditor_assignbattingposition"
        android:title="Assign Batting Position">
    </item>

    <item
        android:id="@+id/teameditor_assignfieldingposition"
        android:title="Assign Feilding Position">
        <!-- I want to include the submenu here-->
    </item>

</menu>

这里的问题类型的回答了这个-我不知道如何膨胀的子菜单。

我想你它充气的onContextItemSelected方法 - 但膨胀需要一个菜单​​对象,这是不传递到onContextItemSelected。

Answer 1:

这是可悲的是不可能的纯XML,但有没有使用说明书的好办法Menu.add*方法:这里是你如何能获得一个Menu实例包括/膨胀的其他文件到:

inflater.inflate(R.menu.player, menu);
MenuItem fp_menu = menu.findItem(R.id.teameditor_assignfieldingposition);
inflater.inflate(R.menu.positions, fp_menu.getSubMenu()); // needs <menu />

您可以使用指定的把上面的代码到以下任一inflater

  • Activity.onCreateContextMenu(menu, v, menuInfo) getMenuInflater()
  • Fragment.onCreateContextMenu(menu, v, menuInfo) getActivity().getMenuInflater()
  • Activity.onCreateOptionsMenu(menu)getMenuInflater()
  • Fragment.onCreateOptionsMenu(menu, inflater)inflater

菜单/ player.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/teameditor_remove"
          android:title="Remove Player from Team"
    />
    <item android:id="@+id/teameditor_assignbattingposition"
          android:title="Assign Batting Position"
    />
    <item android:id="@+id/teameditor_assignfieldingposition"
          android:title="Assign Feilding Position">
        <menu><!-- include: positions.xml --></menu>
    </item>
</menu>

<menu />占位符是非常重要的 ,没有这种getSubMenu()将是null

菜单/ positions.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/fp_pitcher"
          android:title="Pitcher"
    />
    <item android:id="@+id/fp_catcher"
          android:title="Catcher"
    />
    <!-- SNIP ---> 
</menu>

注意:您onContextItemSelected想法

我想你它充气的onContextItemSelected方法[...]

我认为这是为时已晚,如果你是onContextItemSelected ,因为你已经处理,这尚未膨胀,这将导致显示你子菜单中的事件...。 你可以尝试同样膨胀到getSubMenu()但我不知道它会显示出来。 这是最好的地方建立它应该要创建的菜单。

注意在包括同一子多次在同一个菜单

未经测试如果你需要充气相同positions.xmlteameditor_assignbattingposition以及你就会有一些问题onOptionsItemSelected / onContextItemSelected 。 解决它的方法之一是将转换findItem变量字段并保存,参照上述两个

this.fp_menu = menu.findItem(R.id.teameditor_assignfieldingposition);
inflater.inflate(R.menu.positions, fp_menu.getSubMenu());
this.bp_menu = menu.findItem(R.id.teameditor_assignbattingposition);
inflater.inflate(R.menu.positions, bp_menu.getSubMenu());

然后在on*ItemSelected

switch (item.getItemId()) {
    case R.id.fp_pitcher:
        if (item == fp_menu.findItem(R.id.fp_pitcher)) {
            // selected inside teameditor_assignfieldingposition
        } else if (item == bp_menu.findItem(R.id.fp_picther)) {
            // selected inside teameditor_assignbattingposition
        } else {
            throw new ImLostInMenusException();
        }
        return true;
}
return super.on*ItemSelected();


Answer 2:

这不是很漂亮,但如果你需要做的是不复制在XML内容(这将轻松地工作)。 当你吹第二个菜单,你也可以做一个menu.findItem(R.id.teameditor_assignfieldingposition).getSubMenu().add(...)为每个要添加的项目。 如果你有一个String数组的资源字符串(“投手”和“守望者”),你可以遍历数组添加相同的项目,如在原。 或者,你可能需要解析其他菜单的XML,你可以通过只充气它我猜,然后用它欺骗的是size()getItem(int)

事实上,你可以只膨胀的第一个菜单进入Menu ,然后使用size()getItem(int)来获取MenuItem出去了吧。 然后,对于每个项目,你可以做add(menuItem.getGroupId(), menuItem.getItemId(), menuItem.getOrder(), menuItem.getTitle())getSubMenu()第二个菜单的的findItem(R.id.teameditor_assignfieldingposition) 。 这应该添加的第一个菜单的所有项目作为该项目的子菜单。 这意味着你正在膨胀两个XML文件,但如果你想使用单独的XML文件,它是一种不可避免的,看到没有一个<include>菜单的XML文件。 我可能会正常充气的第二个菜单(在onCreateOptionsMenu(...)然后添加第一个菜单的子菜单onPrepareOptionsMenu(...)它给你创建的菜单onCreateOptionsMenu(...) 。 我认为你可以做到这一切在onCreateOptionsMenu(...)但我认为这是更好的做法,以使修改菜单onPrepareOptionsMenu(...)

我认为第二个方式是我能找到的,我要离开了第一选项,以防万一替代的最佳解决方案。



文章来源: Android: How to include a menu xml inside another menu xml?