很遗憾,普通的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())
您可以将上述代码放置在以下任意一个位置,使用指定的
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></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"
/>
</menu>
关于你的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)) {
} else if (item == bp_menu.findItem(R.id.fp_picther)) {
} else {
throw new ImLostInMenusException();
}
return true;
}
return super.on*ItemSelected();
getSubMenu()
直接将其inflate
到其中,就不需要手动复制使用add
。此外,获取“*一个[临时]Menu
[...]以从中获取MenuItem
*”是有点不可能的。 - TWiStErRob