¿Cómo puedo añadir un elemento personalizado a un NavigationView con un diseño de menú?

He estado experimentando con la simplificación de algunos códigos de cajón de navegación mediante el uso de la nueva clase NavigationView en la biblioteca de soporte de diseño de Android. Funciona muy bien si sólo quieres iconos a la izquierda, y el texto a la derecha como en el ejemplo de la documentación. Por ejemplo, si uso este diseño de menú:

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/group1" android:checkableBehavior="single"> <item android:id="@+id/nav_screen1" android:icon="@drawable/ic_list_black_24dp" android:title="Screen 1" /> <item android:id="@+id/nav_screen2" android:icon="@drawable/ic_search_black_24dp" android:title="Screen2"/> <item android:id="@+id/nav_screen3" android:icon="@drawable/ic_equalizer_black_24dp" android:title="Screen 3"/> </group> <group android:id="@+id/group2"> <item android:id="@+id/nav_settings" android:icon="@drawable/ic_settings_black_24dp" android:title="Settings"/> </group> </menu> 

El problema es que quiero agregar una sola vista personalizada al diseño que tenga un android.support.v7.widget.SwitchCompat como en la aplicación Google Play Movies (vea la captura de pantalla a continuación). Idealmente, me gustaría agregar la vista personalizada mientras uso mi diseño de menú, pero si eso no es posible sin usar un hack crudo (como hacer uso de un diseño existente generado por la biblioteca de soporte), entonces me gustaría saber el Solución con la menor cantidad de código, y que todavía hace que valga la pena la transición a NavigationView .

He intentado usar el atributo actionLayout para especificar un archivo de diseño personalizado como este:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.SwitchCompat android:layout_width="fill_parent" android:layout_height="match_parent" android:text="@string/night_mode"/> </LinearLayout> 

Sin embargo, ese atributo parecía ser ignorado ya que no funcionaba.

Para referencia, he aquí una captura de pantalla del cajón de navegación de Google Play Movies:

Google Play Movies

La aplicación de gmail también tiene vistas personalizadas para mostrar el número de cuentas correspondientes a las etiquetas.

Esto ahora es posible en Android Support Library 23.1 usando el atributo actionLayout :

NavigationView proporciona una forma conveniente de crear un cajón de navegación, incluida la posibilidad de crear elementos de menú mediante un archivo XML de menú. Hemos ampliado la funcionalidad posible con la posibilidad de configurar vistas personalizadas para los elementos mediante la aplicación: actionLayout o usando MenuItemCompat.setActionView ().

NavigationView es una subclase de FrameLayout , que puede tener varios hijos:

Sin embargo, puede agregar varios hijos a un FrameLayout y controlar su posición dentro del FrameLayout asignando gravedad a cada niño, utilizando el atributo android: layout_gravity.

Esto significa que puede agregar una vista personalizada a su NavigationView :

 <android.support.design.widget.NavigationView android:layout_height="match_parent" android:layout_width="wrap_content" android:layout_gravity="start" android:fitsSystemWindows="true" app:menu="@menu/side_menu"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="200dp" android:layout_gravity="bottom"> <android.support.v7.widget.SwitchCompat android:layout_width="match_parent" android:layout_height="match_parent" android:text="night_mode"/> </LinearLayout> </android.support.design.widget.NavigationView> 

Crear un diseño con switchcompat y mencionarlo en el elemento de menú como

 <item android:id="@+id/notification" android:title="Notification" app:actionLayout="@layout/notify" />` 

A continuación, notificar el diseño añadir esto

 <android.support.v7.widget.SwitchCompat android:id="@+id/switch_compat" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:checked="false" android:onClick="notify"/> 

Onclick es el keyPoint, implementa el controlador en tu Actividad, entonces funcionará.

Es posible que desee echar un vistazo a esta biblioteca: https://github.com/mikepenz/MaterialDrawer . Hace que sea fácil de usar el cajón de navegación y admite vistas personalizadas.

  • Cómo resolver tipos inconvertibles no puede lanzar "Android.support.v4.app.fragment" a "nombre de paquete"
  • Toque en cualquier lugar para deslizar el menú abierto para el cajón de navegación
  • Animación de sugerencias de NavigationDrawer (como Google Currents)
  • Android cambia el ancho del panel del cajón de navegación mediante programación
  • Cajón arrastrable con un asa (en lugar de barra de acción) encima de otras aplicaciones
  • ¿Cómo configurar el margen derecho del cajón de navegación?
  • Cajón de navegación siempre visible (un poco)
  • Android: NavigationDrawer / múltiples actividades / mismo menú
  • La flecha hacia arriba no se muestra después de llamar a ActionBarDrawerToggle.setDrawerIndicatorEnabled (false)
  • Cajón No se muestra el cajón de navegación de salida
  • Cajón de navegación para cambiar las actividades en lugar de fragmentos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.