К сожалению, это невозможно в простом 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();
person
TWiStErRob
schedule
09.12.2014