studio personalizar personalizado icono diseño cambiar android navigation-drawer

personalizar - navigationview android



¿Cómo puedo agregar un elemento personalizado a NavigationView con un diseño de menú? (5)

He estado experimentando con la simplificación de algunos códigos del cajón de navegación haciendo uso de la nueva clase NavigationView en la biblioteca de soporte de diseño de Android. Funciona muy bien si solo desea iconos a la izquierda y texto a la derecha como en el ejemplo de la documentación, pero ¿qué sucede si quiero agregar una vista personalizada única al diseño que tiene un android.support.v7.widget.SwitchCompat como en la aplicación Google Play Movies (ver captura de pantalla a continuación)?

Intenté usar el atributo actionLayout para especificar un archivo de diseño personalizado como en el código de ejemplo a continuación, sin embargo, ese atributo pareció ignorarse ya que no funcionó.

res/menu/navigation_drawer.xml

<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"/> </group> <group android:id="@+id/group2"> <item android:id="@+id/nav_custom" android:icon="@drawable/custom_icon_24dp" app:actionLayout="@layout/nav_drawer_switch" android:title="Custom item with switch"/> <item android:id="@+id/nav_settings" android:icon="@drawable/ic_settings_black_24dp" android:title="Settings"/> </group> </menu>

res/layout/nav_drawer_switch.xml

<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="Custom item with switch"/> </LinearLayout>

¿Cómo puedo hacer que esto funcione? Idealmente, me gustaría agregar la vista personalizada mientras sigo utilizando mi diseño de Menú, pero si eso no es posible sin usar un truco burdo (como aprovechar un diseño existente generado por la biblioteca de soporte), me gustaría saber el solución con la menor cantidad de código, y que todavía hace que valga la pena pasar a NavigationView .


El atributo actionLayout ahora es compatible con Android Support Library 23.1 :

NavigationView proporciona una forma conveniente de construir un cajón de navegación, incluida la capacidad de crear elementos de menú utilizando un archivo XML de menú. Hemos ampliado la funcionalidad posible con la capacidad de establecer vistas personalizadas para los elementos a través de la aplicación: actionLayout o usando MenuItemCompat.setActionView ().

Entonces, el código en la pregunta debería funcionar ahora.



Tuve el mismo problema y descubrí que NavigationView comporta de manera diferente dependiendo de:

  • Ya sea que configure los atributos android:title y android:icon en el item o no
  • Qué tipo de vista contiene su diseño de acción (por ejemplo, TextView u otros)

No establecer los atributos funcionó para personalizar completamente el elemento:

<?xml version="1.0" encoding="utf-8"?> <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:showIn="navigation_view"> <item android:id="@+id/nav_custom" android:title="@null" app:actionLayout="@layout/nav_drawer_switch" /> </menu>

(Tenga en cuenta que tampoco puede configurar android:title , pero eso genera una advertencia en Android Studio).

El resultado:

(Esto es con la versión 27.1.1 de com.android.support:design , no estoy seguro acerca de otras versiones).


crear un diseño con switchcompat y mencionarlo en el elemento del menú como

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

luego notifique el diseño agregue 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á.


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

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

Eso 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>