我如何添加一个自定义项目的菜单布局的NavigationView?

我一直在尝试通过在Androiddevise支持库中使用新的NavigationView类来简化一些导航抽屉代码。 如果您只需要左侧的图标,右侧的文本就好像文档中的示例那样,这样做效果很好。 例如,如果我使用这个菜单布局:

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

问题是,我想添加一个自定义的视图,在Google Play电影应用程序(请参阅下面的屏幕截图)中有一个android.support.v7.widget.SwitchCompat的布局。 理想情况下,我想添加自定义视图,同时仍然使用我的菜单布局,但如果这是不可能的,如果不使用粗糙的黑客(如攻入由支持库生成的现有布局),那么我想知道解决scheme的代码量最less,这仍然值得转换到NavigationView

我尝试使用actionLayout属性来指定一个自定义布局文件,如下所示:

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

然而,这个属性似乎被忽略,因为它没有工作。

作为参考,以下是Google Play电影中的抽屉式导航栏的屏幕截图:

Google Play电影

Gmail应用程序还具有自定义视图来显示标签对应的计数。

Android支持库23.1中现在可以使用actionLayout属性:

NavigationView提供了一种便捷的方式来构build导航抽屉,包括使用菜单XML文件创build菜单项的function。 我们已经扩展了function,可以通过app:actionLayout或使用MenuItemCompat.setActionView()为项目设置自定义视图。

NavigationViewFrameLayout的子类,可以有多个子FrameLayout

但是,您可以将多个子元素添加到FrameLayout,并通过使用android:layout_gravity属性为每个子元素分配重力来控制其在FrameLayout中的位置。

这意味着您可以将自定义视图添加到您的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> 

用switchcompat创build一个布局,并在菜单项as中提到它

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

然后通知布局添加这个

 <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是keyPoint,在您的Activity中实现处理程序,然后它将工作。

你可能想看看这个库: https : //github.com/mikepenz/MaterialDrawer 。 它使得它易于使用导航抽屉,它支持自定义视图。