6

简单的问题。

我有我的子项目菜单:

<?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。

4

2 回答 2

3

遗憾的是,这在纯 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

菜单/播放器.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

菜单/位置.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,因为您已经在处理将导致显示您是子菜单的事件......它还没有膨胀。你可以尝试同样的 inflate into getSubMenu(),但我不确定它会不会出现。最好在应该创建的地方创建菜单。

关于在同一菜单中多次包含同一子菜单的注意事项

未经测试如果您也需要将其充气,您将在/positions.xml遇到。解决它的一种方法是将变量转换为字段并将引用保存到两者teameditor_assignbattingpositiononOptionsItemSelectedonContextItemSelectedfindItem

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();
于 2014-12-09T23:49:41.660 回答
0

这不是很漂亮,但是如果您需要在不复制 XML 内容的情况下执行此操作(这很容易)。当您扩充第二个菜单时,您还可以为menu.findItem(R.id.teameditor_assignfieldingposition).getSubMenu().add(...)要添加的每个项目执行 a。如果您在字符串数组资源中有字符串(“Pitcher”和“Catcher”),您可以遍历该数组以添加与原始数组相同的项目。或者,您可能需要解析其他菜单的 XML,我猜您可以通过膨胀它来欺骗它,然后使用它的size()and getItem(int).

实际上,您可以将第一个菜单膨胀为 a Menu,然后使用size()andgetItem(int)MenuItems 从中取出。然后,对于每个项目,您可以add(menuItem.getGroupId(), menuItem.getItemId(), menuItem.getOrder(), menuItem.getTitle())getSubMenu()第二个菜单的findItem(R.id.teameditor_assignfieldingposition). 这应该将第一个菜单的所有项目添加为该项目的子菜单。这意味着您正在扩充两个 XML 文件,但如果您想使用单独的 XML 文件,这是不可避免的,因为没有<include>用于菜单 XML 文件。我可能会正常膨胀第二个菜单(在 中onCreateOptionsMenu(...)),然后将第一个菜单添加为中的子菜单onPrepareOptionsMenu(...)(它给出了您在 中创建的菜单onCreateOptionsMenu(...))。我认为您可以在 中完成所有操作onCreateOptionsMenu(...),但我认为在 中修改菜单会更好onPrepareOptionsMenu(...)

我认为第二种方法是我能找到的最佳解决方案,我将第一种选择作为替代方案以防万一。

于 2012-11-29T17:58:09.187 回答