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:
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>
En
onNavigationItemSelected()
, obtengaMenuItem
que desea expandir por ID de pedido ( o víafindItem()
), luego obtengaSubMenu
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.