studio ejemplo con bar activities android navigation-drawer android-support-library material-design navigationview

android - ejemplo - ¿Cómo configurar el comportamiento de verificación compartido en todos los grupos en NavigationView?



navigationview android (6)

Aquí está la solución.

Paso 1: Eliminar

android:checkableBehavior="single"

de ambos grupos.

Paso 2: Agregue la siguiente lógica al oyente:

mUiNavigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { menuItem.setCheckable(true); menuItem.setChecked(true); if (mPreviousMenuItem != null) { mPreviousMenuItem.setChecked(false); } mPreviousMenuItem = menuItem; //... changeCurrentFragment(...); return true; } });

Nota: en lugar de llamar a menuItem.setCheckable(true) , puede configurar android:checkable="true" para cada elemento en XML.

La solución de @ Moinkhan también debería funcionar (gracias, upvoted), pero no quería recorrer los elementos del menú cada vez que se seleccionaba una nueva posición.

He creado dos grupos con identificadores únicos (necesito un divisor) y ambos tienen checkableBehavior establecido en single . Esto permite que se revisen varios elementos de diferentes grupos a la vez, y eso es exactamente lo que estoy tratando de evitar. Me gustaría tener un elemento marcado al máximo, en todos los grupos.

Como no he encontrado ninguna forma de hacer esto en XML, intenté implementar una lógica simple en onNavigationItemSelected para desmarcar el elemento del menú anterior:

if (previousItem != null) previousItem.setChecked(false); currentItem.setChecked(true);

pero el setChecked(false) nunca me ha funcionado: el elemento permanece marcado.

Aquí está mi código de muestra:

menu_navigation.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/nav_group_1" android:checkableBehavior="single"> <item android:id="@+id/nav_feed" android:title="@string/feed"/> <item android:id="@+id/nav_people" android:title="@string/people"/> </group> <group android:id="@+id/nav_group_2" android:checkableBehavior="single"> <item android:id="@+id/nav_settings" android:title="@string/settings"/> <item android:id="@+id/nav_help_feedback" android:title="@string/help_feedback"/> <item android:id="@+id/nav_logout" android:title="@string/logout"/> </group>

NavigationItemSelectedListener:

mUiNavigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { if (previousItem != null) previousItem.setChecked(false); currentItem.setChecked(true); //... changeCurrentFragment(...); return true; } });

¡Necesito una pista! Gracias.


Aquí hay una solución simple y dulce que publiqué here :)

Hacer grupos diferentes hace un divisor intermedio Pero crea el problema de dos elementos marcados en el cajón de navegación.

Una forma simple de cómo manejé esto fue:

public boolean onNavigationItemSelected(final MenuItem menuItem) { //if an item from extras group is clicked,refresh NAV_ITEMS_MAIN to remove previously checked item if (menuItem.getGroupId() == NAV_ITEMS_EXTRA) { navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, false, true); navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, true, true); }else{ navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, true, true); navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, false, true); } //Update highlighted item in the navigation menu menuItem.setChecked(true);

}


En realidad, no necesita grupos paralelos separados para los separadores. Puede tener todo en un grupo y colocar submenús (tener títulos) o subgrupos (sin título). Habrá separadores para esos submenús y subgrupos. De esta manera, el comportamiento comprobable funciona sin una solución alternativa. (Para tu información: Esto es en Design Support Lib 23.1.1)

<group android:id="@+id/drawer_group" android:checkableBehavior="single"> <item android:id="@+id/nav_1" android:title="Menu1" /> <item android:id="@+id/nav_2" android:title="Menu2" /> <item android:id="@+id/nav_3" android:title="Menu3" /> <item android:id="@+id/nav_4" android:title="Menu4" /> <item android:id="@+id/drawer_submenu" android:title="Subheader"> <menu> <group android:checkableBehavior="single"> <item android:id="@+id/nav_sub1_1" android:title="Menu_Sub1_1" /> <item android:id="@+id/nav_sub1_2" android:title="Menu_Sub1_2" /> </group> </menu> </item> <group android:id="@+id/drawer_subgroup"> <item android:id="@+id/nav_subgroup_item" android:title="Menu_Sub2_2" /> </group> </group>

En el código, simplemente hago lo siguiente y las comprobaciones individuales funcionan como se esperaba:

@Override public boolean onNavigationItemSelected(MenuItem item) { mNavigationView.setCheckedItem(item.getItemId()); ... }


No es necesario eliminar checkableBehavior="single" , solo use

navigationView.setCheckedItem(item.getItemId());

en lugar de item.setChecked(true) .


Ok, encontré la solución ... solo agregue este fragmento de código al método onNavigationItemSelected

@Override public boolean onNavigationItemSelected(MenuItem menuItem) { Menu m = navView.getMenu(); for (int i=0;i<m.size();i++) { MenuItem mi = m.getItem(i); if (!(mi.getItemId() == menuItem.getItemId())) { mi.setCheckable(false); } } menuItem.setCheckable(true); menuItem.setChecked(true); return false; }

eso es todo .. Y sí setChecked (falso) no funciona. Solo porque de la lista de menú debe haber un solo elemento debe ser revisado. Por lo tanto, solo puede desactivarlo cuando seleccione otro elemento. Y si hace clic en el elemento seleccionado, la vista de navegación nunca lo desactivará. Solo porque el escenario lo tengo explicado.


Parece que hay un error de invalidación en la implementación de NavigationView , pero no necesita usar setCheckable() , solo tiene que invalidar el NavigationView después de llamar a setChecked(false) , así:

previousItem.setChecked(false); navigationView.invalidate();

Sin embargo, el grupo de menú no debe tener checkableBehavior="single" , porque en el modo exclusivo, llamar a setChecked(boolean) en un elemento de MenuItem en el grupo establecerá ese elemento como marcado si pasas verdadero o falso. Entonces, para que setChecked(false) funcione, debes eliminar checkableBehavior="single" de tus definiciones de menú.

He creado un problema sobre esto aquí: https://code.google.com/p/android/issues/detail?id=178709