在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并且想知道是否应该更好地使用子菜单而不是菜单组?
检查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);
我这样解决了:
设置菜单:
在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; }
我希望,这有帮助