studio example ejemplo customize bottom bar android navigationview android-navigationview

android - example - ¿Cómo desmarcar los elementos marcados en la vista de navegación?



navigationview android studio example (9)

Al citar @Codeversed, " no hay necesidad de hacer un bucle en los elementos del menú con una sobrecarga adicional ". Pero, no es necesario crear múltiples grupos (en este caso, él está creando @+id/grp1 y @+id/grp2 ) para desmarcar un elemento marcado anterior.

Puedes simplemente agregar un solo grupo para todos los elementos con el android:checkableBehavior , como esto:

<group android:checkableBehavior="single"> <item android:id="@+id/id1" android:checked="true" android:icon="@drawable/drawable1" android:title="@string/string1" /> <item android:id="@+id/id2" android:icon="@drawable/drawable2" android:title="@string/string2" /> </group>

Sé que es posible resaltar un elemento de vista de navegación llamando a setCheckedItem() o devolver el valor verdadero en onNavigationItemSelected para mostrar el elemento como el elemento seleccionado, pero ¿Cómo puedo deseleccionar los elementos onNavigationItemSelected de una vista de navegación?


Combino las respuestas de @arsent y @Rahul y escribo este código:

private void NavigationView_NavigationItemSelected(object sender, NavigationView.NavigationItemSelectedEventArgs e) { var size = navigationView.Menu.Size(); for (int i = 0; i < size; i++) { var item= navigationView.Menu.GetItem(i).SetChecked(false); if (item.HasSubMenu) { for (int j = 0; j < item.SubMenu.Size(); j++) { item.SubMenu.GetItem(j).SetChecked(false); } } } e.MenuItem.SetChecked(true); drawerLayout.CloseDrawers(); }

el código anterior es para xamarin c # y funciona, pero puedes convertirlo fácilmente a java


Esto desactivará los elementos:

int size = mNavigationView.getMenu().size(); for (int i = 0; i < size; i++) { mNavigationView.getMenu().getItem(i).setChecked(false); }


Las soluciones de Joao no funcionaron como yo lo esperaba totalmente. Esto daría lugar a un espacio en blanco desde la vista de artículos sin marcar en mi navegación.

Solo asegúrate de establecer la vista como desaparecida:

<item android:id="@+id/your_menu_item_id_to_hide" android:title="" android:visible="false"/> bottomNavigationView.getMenu().findItem(R.id.your_menu_item_id_to_hide).setChecked(true); bottomNavigationView.findViewById(R.id.your_menu_item_id_to_hide).setVisibility(View.GONE);

La solución no es necesaria en este caso.


Para desmarcar todos los elementos de SubMenu incluidos los elementos de SubMenu , debe utilizar la recursión:

private void unCheckAllMenuItems(@NonNull final Menu menu) { int size = menu.size(); for (int i = 0; i < size; i++) { final MenuItem item = menu.getItem(i); if(item.hasSubMenu()) { // Un check sub menu items unCheckAllMenuItems(item.getSubMenu()); } else { item.setChecked(false); } } }

Llame al método anterior para desmarcar todos los elementos, como a continuación:

unCheckAllMenuItems(navigationView.getMenu());


Supongo que alguien como yo usa esos métodos como este

public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.nav_today: break; case R.id.nav_calendar: navigationView.getMenu().performIdentifierAction(R.id.nav_today, 0); navigationView.getMenu().getItem(0).setChecked(true);//or navigationView.setCheckedItem(R.id.nav_today);//or drawerLayout.closeDrawers(); break; } return true; }

Intentando verificar R.id.nav_today después de hacer clic en R.id.nav_calendar , (btw: checkableBehavior="single" ), desafortunadamente no funcionará.

Esto se debe a que después de que se navigationView.setCheckedItem(R.id.nav_today) su código navigationView.setCheckedItem(R.id.nav_today) se R.id.nav_today inmediato R.id.nav_today , pero después de esto, se hará clic en R.id.nav_calendar .

Es por eso que cualquier método que uses parece que nunca funciona en absoluto. Es un trabajo, pero se anulará de inmediato.


Todo lo que necesitas hacer es rodear a tus grupos así:

<group> <group android:id="@+id/grp1"> <item android:id="@+id/nav_profile" android:icon="@drawable/ic_account_circle_24dp" android:title="@string/profile" /> </group> <group android:id="@+id/grp2"> <item android:id="@+id/nav_settings" android:icon="@drawable/ic_settings_24dp" android:title="@string/settings" /> <item android:id="@+id/nav_help" android:icon="@drawable/topic_help" android:title="@string/help_feedback" /> </group> </group>

No hay necesidad de hacer un bucle con los elementos del menú con sobrecarga adicional


Vi la solución @arsent y la probé, y de hecho hará lo que quieras, que consiste en deseleccionar todos los elementos ... pero tuve un problema en el siguiente escenario:

  1. Seleccione el elemento de menú 1 (usando NavigationView#setCheckedItem )
  2. Deseleccione todos los elementos según la solución de @arsent
  3. Seleccione el elemento de menú 1 nuevamente (utilizando NavigationView#setCheckedItem )

En este escenario, el elemento 1 no se marcará como marcado. Esto se debe a que internamente la vista de navegación hace un seguimiento del conjunto de elementos seleccionado previamente en el paso 1, que no cambia en el paso 2, y simplemente omite el paso 3 porque el elemento seleccionado anteriormente es el mismo que el que estamos seleccionando ahora.

Mi sugerencia (y una solución alternativa) para evitar esto es simplemente tener un elemento invisible ficticio y usar NavigationView#setCheckedItem para seleccionar ese elemento cada vez que desee deseleccionar todo, como así

<item android:id="@+id/menu_none" android:title="" android:visible="false"/>

Para deseleccionar todo simplemente hazlo.

mNavigationView.setCheckedItem(R.id.menu_none);


acaba de hacer sus artículos no verificables como tal

<item android:id="@+id/profile_item" android:checkable="false" android:title="@string/profile"/>