Android 如何在NavigationView中将项目添加到菜单组

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

在Android的文字游戏中,我目前有一个从
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;
    }