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.
Es posible que desee echar un vistazo a esta biblioteca: https://github.com/mikepenz/MaterialDrawer . Facilita el uso del cajón de navegación y admite vistas personalizadas.
Tuve el mismo problema y descubrí que
NavigationView
comporta de manera diferente dependiendo de:
-
Ya sea que configure los atributos
android:title
yandroid:icon
en elitem
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>