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