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:
- Seleccione el elemento de menú 1 (usando
NavigationView#setCheckedItem
) - Deseleccione todos los elementos según la solución de @arsent
- 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"/>