Android 如何在NavigationView中将项目添加到菜单组
在Android的文字游戏中,我目前有一个从Android 如何在NavigationView中将项目添加到菜单组,android,drawerlayout,navigationview,navigation-drawer,Android,Drawerlayout,Navigationview,Navigation Drawer,在Android的文字游戏中,我目前有一个从left\u drawer\u menu.xml膨胀的硬编码菜单,由3组组成(我的回合、对手回合以及最后的其他内容): 现在,我正在尝试动态更改该菜单 我有一个包含所有游戏数据的SQLite实例,并使用IntentService读取/写入数据库-这部分工作正常 我目前的困难是:使用以下代码,新项目将添加到R.id.My_move组之外: if (mLeftItem == R.id.start) { startNewGame(); R
left\u drawer\u menu.xml
膨胀的硬编码菜单,由3组组成(我的回合、对手回合以及最后的其他内容):
现在,我正在尝试动态更改该菜单
我有一个包含所有游戏数据的SQLite实例,并使用IntentService
读取/写入数据库-这部分工作正常
我目前的困难是:使用以下代码,新项目将添加到R.id.My_move
组之外:
if (mLeftItem == R.id.start) {
startNewGame();
Random r = new Random();
int i = r.nextInt(100);
menu.add(R.id.my_move, i, i, "Item " + i); // why is my_move ignored?
}
更新:
作为进一步测试,我尝试使用以下代码将偶数项和非偶数项分配给两个单独的组:
Random r = new Random();
int i = r.nextInt(100);
int group = 1 + (i % 2); // can be 1 or 2
menu.add(group, i, i, "Item " + i);
然而,结果看起来很混乱:
此外,我还发现了(可能已经修复了?),并想知道是否应该更好地使用子菜单而不是菜单组
menu.add(R.id.my_move, i, i, "Item " + i);
您还将订单(第三个参数)分配为i
。我猜这会覆盖groupId。如前所述,尝试将其设置为NONE
编辑:
也许是这样的
MenuItem lastItem = menu.findItem(R.id.<lastItemId>);
int lastOrder= lastItem.getOrder();
menu.add(R.id.my_move, i, lastOrder-5, "Item " + i);
MenuItem lastItem=menu.findItem(R.id.);
int lastOrder=lastItem.getOrder();
菜单.添加(R.id.my_move,i,lastOrder-5,“项目”+i);
顺序
是类别和顺序的组合,因此它可能不像这样简单。检查源代码
...
* @param group Item ordering grouping control. The item will be added after
* all other items whose order is <= this number, and before any
* that are larger than it. This can also be used to define
* groups of items for batch state changes. Normally use 0.
...
MenuItemImpl(MenuBuilder menu, int group, int id, int categoryOrder, int ordering,
CharSequence title, int showAsAction) {
如果要添加到第二个组,请将其添加为:
menu.add(R.id.my_move, Menu.NONE, 0, "Item1");
menu.add(R.id.his_move, Menu.NONE, 1, "Item2");
代码中的问题可能是xml中的所有项都有默认的orderInCategory 0,因此新项会在之后添加
所有这些项目
更新
要添加图标,请使用菜单项的方法
menu.add(R.id.my_move, Menu.NONE, 0, "Item1").setIcon(R.drawable.ic_stars_black_24dp);
我是这样解决的:
设置菜单:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="my moves"
android:id="@+id/submenu_1">
<menu>
<item
android:id="@+id/my_dummy_item_1"
android:icon="@drawable/ic_menu_camera"
android:title="Import" />
<item
android:id="@+id/my_dummy_item_2"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery" />
<item
android:id="@+id/add_item"
android:icon="@drawable/ic_menu_manage"
android:title="Add Item" />
</menu>
</item>
<item android:title="opponent's moves"
android:id="@+id/submenu_2">
<menu>
<item
android:id="@+id/opponent_dummy_item_1"
android:icon="@drawable/ic_menu_camera"
android:title="Import" />
<item
android:id="@+id/opponent_dummy_item_2"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery" />
<item
android:id="@+id/opponent_dummy_item_3"
android:icon="@drawable/ic_menu_manage"
android:title="Tools" />
</menu>
</item>
</menu>
我希望,,它有助于不幸的是菜单。没有一个不能解决问题,菜单项仍然添加在导航视图菜单的底部,而不是最上面的组中。您可以尝试根据菜单中已有的项计算所需的顺序并设置顺序。您可以将xml发布到定义了组的位置吗?谢谢你,给你:看,梅帮了你谢谢+1的回答。您知道如何为子菜单项添加图标吗?此外,这些项目的高光颜色似乎不同…这很好,颜色也相同(使用子菜单时,高光颜色与原始菜单不同)。但是我想知道,如何为动态添加的菜单项设置图标?使用setIcon
方法设置图标,回答更新。这似乎有点愚蠢。。您指定了一个组来添加项目,但是Android只是忽略它并将其转储到列表的末尾,除非您为不在同一组中的项目指定顺序?谷歌到底在干什么?此外,它还在为我添加组后的项目:/
menu.add(R.id.his_move, Menu.NONE, 1, "Item2");
menu.add(R.id.my_move, Menu.NONE, 0, "Item1").setIcon(R.drawable.ic_stars_black_24dp);
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="my moves"
android:id="@+id/submenu_1">
<menu>
<item
android:id="@+id/my_dummy_item_1"
android:icon="@drawable/ic_menu_camera"
android:title="Import" />
<item
android:id="@+id/my_dummy_item_2"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery" />
<item
android:id="@+id/add_item"
android:icon="@drawable/ic_menu_manage"
android:title="Add Item" />
</menu>
</item>
<item android:title="opponent's moves"
android:id="@+id/submenu_2">
<menu>
<item
android:id="@+id/opponent_dummy_item_1"
android:icon="@drawable/ic_menu_camera"
android:title="Import" />
<item
android:id="@+id/opponent_dummy_item_2"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery" />
<item
android:id="@+id/opponent_dummy_item_3"
android:icon="@drawable/ic_menu_manage"
android:title="Tools" />
</menu>
</item>
</menu>
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.add_item) {
Random r = new Random();
int i = r.nextInt(100);
MenuItem myMoveGroupItem = navigationView.getMenu().getItem(0);
// MenuItem myMoveGroupItem = navigationView.getMenu().findItem(R.id.submenu_1); -- it also works!
SubMenu subMenu = myMoveGroupItem.getSubMenu();
subMenu.add("Item "+i);
}
return true;
}