当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将项目添加到NavigationView中的菜单组》经验,为你挑选了2个好方法。

在Android的文字游戏中,我目前有一个硬编码的菜单left_drawer_menu.xml,由3组(轮到我,回合对手,最后是其他东西)组成.

应用截图

mLeftDrawer = (NavigationView) findViewById(R.id.left_drawer);
mLeftDrawer.setNavigationItemSelectedListener(
        new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(final MenuItem menuItem) {
                Menu menu = mLeftDrawer.getMenu();

                if (menuItem.getGroupId() == R.id.my_move) {
                    menu.setGroupCheckable(R.id.my_move, true, true);
                    menu.setGroupCheckable(R.id.his_move, false, false);
                    menu.setGroupCheckable(R.id.extras, false, false);
                } else if (menuItem.getGroupId() == R.id.his_move) {
                    menu.setGroupCheckable(R.id.my_move, false, false);
                    menu.setGroupCheckable(R.id.his_move, true, true);
                    menu.setGroupCheckable(R.id.extras, false, false);
                } else if (menuItem.getGroupId() == R.id.extras) {
                    menu.setGroupCheckable(R.id.my_move, false, false);
                    menu.setGroupCheckable(R.id.his_move, false, false);
                    menu.setGroupCheckable(R.id.extras, true, true);
                }

                menuItem.setChecked(true);
                mLeftItem = menuItem.getItemId();
                mDrawerLayout.closeDrawer(mLeftDrawer);
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (mLeftItem == R.id.start) {
                            startNewGame();
                        } 
                    }
                },DRAWER_CLOSE_DELAY);

                return true;
            }
        });

现在我正在尝试动态更改该菜单.

我有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?
} 

应用截图

更新:

作为进一步的测试,我尝试使用以下代码将偶数项甚至是偶数项分配给2个单独的组:

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);

但结果看起来很混乱:

应用截图

另外我发现(可能已经修复了?)问题176300并且想知道是否应该更好地使用子菜单而不是菜单组?



1> random..:

检查MenuItemImpl源代码

     ...
     *    @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) {

因此,您应该在xml中定义排序(为一个组中的项目提供相同的顺序,并在每个后续组中增加)



    
        
        
    
    
        
        
        
    
    .....


并在代码中添加项目时提供适当的订单值.因此,如果要在第一组末尾添加项目,请将其添加为:

menu.add(R.id.my_move, Menu.NONE, 0, "Item1");

如果要添加到第二组,请将其添加为:

menu.add(R.id.his_move, Menu.NONE, 1, "Item2");

您的代码的问题可能是xml中的所有项都具有默认的orderInCategory 0,因此在所有这些项之后添加新项.

UPDATE

添加图标使用setIcon方法MenuItem

menu.add(R.id.my_move, Menu.NONE, 0, "Item1").setIcon(R.drawable.ic_stars_black_24dp);


这似乎有点愚蠢..您指定了要添加项目的组,但是Android只会忽略它并将其转储到列表的末尾,除非您为不在同一组中的项目指定订单?什么鬼谷歌?此外,它仍在为我添加了分组之后的项目:/

2> Konstantin L..:

在此输入图像描述

我这样解决了:

    设置菜单:

    
    
        
            
                
                
                
            
        
        
            
                
                
                
            
        
    
    

    onNavigationItemSelected(),MenuItem您希望按订单ID(通过findItem())进行扩展,然后从中获取SubMenu并添加新项目:

    @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;
    }
    

我希望,这有帮助

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有