¿Cómo crear un divisor simple en el nuevo NavigationView?

Google introdujo el NavigationView en la versión 22.2.0 de la biblioteca de soporte de diseño con la que puede crear un cajón muy fácilmente utilizando un recurso de menú.

¿Cómo puedo crear una línea divisoria simple entre dos elementos? La agrupación de los elementos no funcionó. La creación de una sección de elementos secundarios crea una línea de división, pero requiere un título, que no quiero.

Cualquier ayuda sería apreciada.

10 Solutions collect form web for “¿Cómo crear un divisor simple en el nuevo NavigationView?”

Todo lo que necesitas hacer es definir un group con un ID único , he comprobado la implementación si el grupo tiene id diferente que va a crear un divisor.

Ver el Android Fuente:

Ver implementación desde la línea 483-488

Menú de ejemplo, creando el separador:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <group android:id="@+id/grp1" android:checkableBehavior="single" > <item android:id="@+id/navigation_item_1" android:checked="true" android:icon="@drawable/ic_home" android:title="@string/navigation_item_1" /> </group> <group android:id="@+id/grp2" android:checkableBehavior="single" > <item android:id="@+id/navigation_item_2" android:icon="@drawable/ic_home" android:title="@string/navigation_item_2" /> </group> </menu> 

Crear un dibujable drawer_item_bg.xml como este,

  <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle" > <solid android:color="#F4F4F4" /> </shape> </item> <item android:top="-2dp" android:right="-2dp" android:left="-2dp"> <shape> <solid android:color="@android:color/transparent" /> <stroke android:width="1dp" android:color="#EAEAEA" /> </shape> <!-- android:dashGap="10px" android:dashWidth="10px" --> </item> </layer-list> 

Y agréguelo a NavigationView como aplicación: itemBackground = "@ drawable / drawer_item_bg"

 <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="#F4F4F4" android:layout_gravity="start" android:fitsSystemWindows="false" app:menu="@menu/activity_main_drawer" app:itemBackground="@drawable/drawer_item_bg"/> 

Y aquí vamos … captura de pantalla

Creo que tengo una solución aún mejor para el problema de múltiples elementos seleccionados. Usando mi manera usted no tiene que preocuparse de cambiar su código al agregar nuevas secciones a su menú. Mi menú se parece a la solución aceptada escrita por Jared, con la diferencia de usar andoid: checkableBehavior = " all " en los grupos:

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/first_section" android:checkableBehavior="all"> <item android:id="@+id/frontpage" android:icon="@drawable/ic_action_home_24dp_light_blue" android:title="@string/drawer_frontpage" /> <item android:id="@+id/search" android:icon="@drawable/ic_search" android:title="@string/drawer_search" /> </group> <group android:id="@+id/second_section" android:checkableBehavior="all"> <item android:id="@+id/events" android:icon="@drawable/ic_maps_local_movies_24dp_light_blue" android:title="@string/drawer_events" /> </group> </menu> 

El checkableBehavior de 'todo' hace posible comprobar / desmarcar elementos individuales a voluntad, independientemente de qué grupo pertenecen. Sólo tienes que guardar el último menú controlado. El código java se ve así:

 private MenuItem activeMenuItem; @Override public boolean onNavigationItemSelected(MenuItem menuItem) { // Update selected/deselected MenuItems if (activeMenuItem != null) activeMenuItem.setChecked(false); activeMenuItem = menuItem; menuItem.setChecked(true); drawerLayout.closeDrawers(); return true; } 

Hacer grupos diferentes como la respuesta de Nilesh hace un divisor intermedio Pero crea el problema de dos elementos marcados en el cajón de nav.

Una manera simple cómo manejé esto era:

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

Simple agregar DeviderItemDecoration:

 NavigationView navigationView = (NavigationView) findViewById(R.id.navigation); NavigationMenuView navMenuView = (NavigationMenuView) navigationView.getChildAt(0); navMenuView.addItemDecoration(new DividerItemDecoration(MainActivity.this,DividerItemDecoration.VERTICAL)); 

Se parece a esto:

Introduzca aquí la descripción de la imagen

Quería divisores sobre el primer artículo y después del último artículo. Utilizando la solución @Nilesh tuve que añadir elementos de menú ficticio y establecer habilitado a falso que se sentía muy sucio. Además, ¿qué pasa si quiero hacer otras cosas interesantes en mi menú?

Me di cuenta de la NavigationView amplía FrameLayout para que pueda poner su propio contenido en él como lo haría para un FrameLayout. A continuación, establecer un menú vacío xml para que sólo muestra mi diseño personalizado. Entiendo que esto va probablemente contra la trayectoria que Google quisiera que tomáramos pero si usted quiere un menú verdaderamente de encargo esto es una manera fácil de hacerlo.

 <!--Note: NavigationView extends FrameLayout so we can put whatever we want in it.--> <!--I don't set headerLayout since we can now put that in our custom content view--> <android.support.design.widget.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:menu="@menu/empty_menu"> <!--CUSTOM CONTENT--> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- CUSTOM HEADER --> <include android:id="@+id/vNavigationViewHeader" layout="@layout/navigation_view_header"/> <!--CUSTOM MENU--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_below="@+id/vNavigationViewHeader"> <View style="@style/NavigationViewLineSeperator"/> <Button android:text="Option 1"/> <View style="@style/NavigationViewLineSeperator"/> <Button android:text="Option 2"/> <View style="@style/NavigationViewLineSeperator"/> </LinearLayout> </RelativeLayout> </android.support.design.widget.NavigationView> 

Aquí está el estilo

 <style name="NavigationViewLineSeperator"> <item name="android:background">@drawable/line_seperator</item> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">1dp</item> </style> 

Y estirable

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@color/white"/> <size android:width="100sp" android:height="1sp" /> </shape> 

Y el menú

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> </menu> 

editar:

En lugar de botones puede utilizar TextView con dibujable que imita los elementos de menú originales aspecto:

  <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/menu_support" android:drawableLeft="@drawable/menu_icon_support" style="@style/MainMenuText" /> // style.xml <style name="MainMenuText"> <item name="android:drawablePadding">12dp</item> <item name="android:padding">10dp</item> <item name="android:gravity">center_vertical</item> <item name="android:textColor">#fff</item> </style> 

El crédito debe ir a Zorawar para la solución, Lo siento por duplicar la respuesta, pero no pudo agregar tanto texto con formato dentro de un comentario.

La solución de Zorawar funciona, el código podría ser mejorado como tal:

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

La respuesta de Nileh es correcta, excepto que tiene un defecto de doble comprobación.

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single" android:id="@+id/grp1"> <item android:id="@+id/nav_register_customer" android:icon="@drawable/ic_menu_camera" android:checkableBehavior="none" android:title="Register Customer" /> </group> <group android:id="@+id/grp2" android:checkableBehavior="single" > <item android:id="@+id/nav_slideshow" android:icon="@drawable/ic_menu_slideshow" android:checkableBehavior="none" android:title="Slideshow" /> </group> </menu> 

Así que usando

Android: checkableBehavior = "solo"

Con id único resolverá el problema

Si desea añadir divisor dinámicamente , sólo puede agregar un SubMenu vacío como este:

 Menu menu = navigationView.getMenu(); menu.addSubMenu(" ").add(" "); 

Esto agregará un divisor.

Sólo asegúrese de pasar en el índice de la derecha cuando se utiliza menu.getItem(int index)

No estoy seguro de si esto está arreglado en la API 26 (Android 8) o era posible todo el tiempo. Todavía soy un novato en la programación de Android. Sin embargo he añadido grupos de padres como se muestra a continuación. Pruebas en Android 6 teléfono físico,

  1. Tengo el divisor
  2. Al seleccionar cualquier elemento de nav_g1 o nav_g2 se nav_g2 selección de otros elementos.
  3. Ningún acolchado adicional añadido debido a grupos anidados.
  4. No he añadido ningún código Java a los oyentes

Código de Menú

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <group android:id="@+id/nav_g1" android:checkableBehavior="single"> <item android:id="@+id/nav_1" android:icon="@drawable/ic_menu_share" android:title="@string/nav_1"/> <item android:id="@+id/nav_2" android:icon="@drawable/ic_menu_share" android:title="@string/nav_2"/> </group> <group android:id="@+id/nav_g2" android:checkableBehavior="single"> <item android:id="@+id/nav_3" android:icon="@drawable/ic_menu_share" android:title="@string/nav_3"/> <item android:id="@+id/nav_4" android:icon="@drawable/ic_menu_share" android:title="@string/nav_4"/> </group> </group> <item android:title="Actions"> <menu> <item android:id="@+id/nav_7" android:icon="@drawable/ic_menu_share" android:title="@string/nav_7"/> <item android:id="@+id/nav_8" android:icon="@drawable/ic_menu_share" android:title="@string/nav_8"/> </menu> </item> </menu> 

Notas

  1. Como se menciona en esta respuesta cada grupo necesita tener un Id único para mostrar el divisor.
  2. Según esta respuesta, los espacios coinciden con las especificaciones de diseño de material de google.
  3. Tener android:checkableBehavior="single" para el grupo de padres es necesario para que el problema de múltiples elementos de menú seleccionados en esta respuesta (mencionado en los comentarios de hungryghost) no sucede

Y aquí está la captura de pantalla

Captura de pantalla de la pantalla del dispositivo

  • Uso de NavigationView desde Android Design Support Library
  • Cómo configurar el recuento de notificaciones no leídas en NavigationView de DrawerLayout?
  • Error de lanzamiento de NavigationView: No se encontró ningún identificador de recurso para el atributo 'menu' en el paquete
  • Configuración del relleno de la barra de estado en NavigationView en Android
  • Cambiar la separación entre el grupo de encabezados y el primer elemento
  • Agregue un separador de sección para el Cajón de navegación en Android
  • ¿Cómo agregar valor de notificación para el elemento en NavigationView para el cajón de diseño de material?
  • agrega onClickListener al encabezado de vista de navegación usando la biblioteca de soporte de diseño de android
  • Cómo agregar vistas personalizadas en el nuevo NavigationView
  • Cómo establecer el comportamiento de comprobación compartida en todos los grupos en NavigationView?
  • ¿Cómo cambiar la dirección de los iconos para los elementos del menú en un NavigationView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.