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