遗憾的是,这在纯 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
menu/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!
menu/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.xml 膨胀到teameditor_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();