tutorial studio personalizado hamburguesa hamburger android navigation-drawer drawerlayout navigationview android-navigation-drawer

android - studio - navigation view menu



Cómo agregar un elemento a un grupo de menú en NavigationView (3)

Al verificar el código fuente de 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) {

Por lo tanto, debe definir el orden en su xml (dar el mismo orden a los artículos en un grupo e incrementar en cada grupo siguiente)

<menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/my_move" android:checkableBehavior="single"> <item android:orderInCategory="0" android:id="@+id/game1" android:icon="@drawable/ic_stars_black_24dp" android:title="Game #1" /> <item android:orderInCategory="0" android:id="@+id/game2" android:icon="@drawable/ic_stars_black_24dp" android:title="Game #2" /> </group> <group android:id="@+id/his_move" android:checkableBehavior="single"> <item android:orderInCategory="1" android:id="@+id/game5" android:icon="@drawable/ic_clock_black_24dp" android:title="Game #5" /> <item android:orderInCategory="1" android:id="@+id/game6" android:icon="@drawable/ic_clock_black_24dp" android:title="Game #6" /> <item android:orderInCategory="1" android:id="@+id/game7" android:icon="@drawable/ic_clock_black_24dp" android:title="Game #7" /> </group> ..... </menu>

y dé un valor de pedido apropiado mientras agrega el artículo en su código. Entonces, si desea agregar el elemento al final del primer grupo, agréguelo como:

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

y si desea agregar al segundo grupo, agréguelo como:

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

El problema con su código podría ser que todos los elementos en el xml tienen orden predeterminada en la categoría 0, por lo que el nuevo elemento se agrega después de todos estos elementos.

ACTUALIZAR

Para agregar ícono use el método setIcon para MenuItem

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

En un juego de palabras para Android actualmente tengo un menú hardcoded inflado de left_drawer_menu.xml y que consta de 3 grupos (mi turno, turno del oponente y finalmente otras cosas):

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

Ahora estoy tratando de cambiar ese menú dinámicamente.

Tengo una instancia de SQLite que contiene todos los datos del juego y uso IntentService para leer / escribir la base de datos, esa parte funciona bien.

Mi dificultad actual es: con el siguiente código, los nuevos elementos se agregan fuera del grupo 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? }

ACTUALIZAR:

Como prueba adicional, he intentado asignar incluso y no elementos a 2 grupos separados con este código:

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

Sin embargo, el resultado parece caótico:

¿También he descubierto el problema (¿probablemente ya está solucionado?) 176300 y me pregunto si tal vez los submenús deberían usarse mejor en lugar de los grupos de menús?


Lo he resuelto de esta manera:

  1. Configura el menú:

    <?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>

  2. En onNavigationItemSelected() , obtenga MenuItem que desea expandir por ID de pedido ( o vía findItem() ), luego obtenga SubMenu y agregue un nuevo elemento:

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

Espero que ayude


menu.add(R.id.my_move, i, i, "Item " + i);

También está asignando la orden (tercer parámetro) como i . Supongo que esto está anulando el groupId. Intenta configurarlo como NONE como se menciona here

menu.add(R.id.my_move, i, NONE, "Item " + i);

Edit: Tal vez algo como esto

MenuItem lastItem = menu.findItem(R.id.<lastItemId>); int lastOrder= lastItem.getOrder(); menu.add(R.id.my_move, i, lastOrder-5, "Item " + i);

Order es una combinación de categoría y orden, por lo que podría no ser tan sencillo como este.