简单的问题。
我有我的子项的菜单:
<?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。
这是可悲的是不可能的纯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
菜单/ 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
!
菜单/ 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();
这不是很漂亮,但如果你需要做的是不复制在XML内容(这将轻松地工作)。 当你吹第二个菜单,你也可以做一个menu.findItem(R.id.teameditor_assignfieldingposition).getSubMenu().add(...)
为每个要添加的项目。 如果你有一个String数组的资源字符串(“投手”和“守望者”),你可以遍历数组添加相同的项目,如在原。 或者,你可能需要解析其他菜单的XML,你可以通过只充气它我猜,然后用它欺骗的是size()
和getItem(int)
事实上,你可以只膨胀的第一个菜单进入Menu
,然后使用size()
和getItem(int)
来获取MenuItem
出去了吧。 然后,对于每个项目,你可以做add(menuItem.getGroupId(), menuItem.getItemId(), menuItem.getOrder(), menuItem.getTitle())
在getSubMenu()
第二个菜单的的findItem(R.id.teameditor_assignfieldingposition)
。 这应该添加的第一个菜单的所有项目作为该项目的子菜单。 这意味着你正在膨胀两个XML文件,但如果你想使用单独的XML文件,它是一种不可避免的,看到没有一个<include>
菜单的XML文件。 我可能会正常充气的第二个菜单(在onCreateOptionsMenu(...)
然后添加第一个菜单的子菜单onPrepareOptionsMenu(...)
它给你创建的菜单onCreateOptionsMenu(...)
。 我认为你可以做到这一切在onCreateOptionsMenu(...)
但我认为这是更好的做法,以使修改菜单onPrepareOptionsMenu(...)
我认为第二个方式是我能找到的,我要离开了第一选项,以防万一替代的最佳解决方案。