Googleの サポートライブラリ のリビジョン22.2.0の新しい NavigationView を使用しています。メニューresを使用して入力されたナビゲーションドロワーを生成するのに完全に機能します。
ListViewまたはRecyclerViewをナビゲーションドロワーに追加して、カスタムアダプターコードを使用してデータを入力できるようにすると、メニューリソースよりもはるかに高い柔軟性が得られるのではないかと思いました。
現在のXMLは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
Android:id="@+id/drawer_layout"
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"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context=".MainActivity">
<FrameLayout
Android:id="@+id/content_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/main_toolbar" />
</FrameLayout>
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
app:headerLayout="@layout/navigation_drawer_header"
app:menu="@menu/menu_navigation_drawer" />
</Android.support.v4.widget.DrawerLayout>
XMLのどこにListViewまたはRecyclerViewを追加しますか?
[〜#〜] edit [〜#〜]
Basantの提案に従って、私はListViewをNavigationViewにネストしました。あなたはメニュー解像度から膨らませる能力を失います(私が知る限り)が、それは私がやりたいことで成功します。ヘッダーXMLは変更されず、XMLに含まれています。
新しいコード:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
Android:id="@+id/drawer_layout"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context=".MainActivity">
<FrameLayout
Android:id="@+id/content_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/main_toolbar" />
</FrameLayout>
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start">
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<include
Android:id="@+id/navigation_drawer_header_include"
layout="@layout/navigation_drawer_header" />
<ListView
Android:id="@+id/navigation_drawer_list"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_below="@id/navigation_drawer_header_include"/>
</RelativeLayout>
</Android.support.design.widget.NavigationView>
</Android.support.v4.widget.DrawerLayout>
ListView
内にRecyclerView
またはNavigationView
をネストできます。
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
Android:id="@+id/drawer_layout"
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"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context=".MainActivity">
<FrameLayout
Android:id="@+id/content_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/main_toolbar" />
</FrameLayout>
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"/>
<ListView
Android:id="@+id/menuList"
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>
</Android.support.v4.widget.DrawerLayout>
注: ListViewを使用すると、NavigationViewのヘッダーを使用できないことに注意してください。追加するListViewのヘッダービューを使用する必要があります。 app:menu
およびapp:header
フィールドを削除することを忘れないでください。
NavigationView内にビューを追加する場合、次のようなことができます。これにより、ListViewを使用してNavigtionViewにヘッダーを追加する際の制限がなくなります。
<Android.support.v4.widget.DrawerLayout 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"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="false"
>
<LinearLayout
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<include layout="@layout/nav_header_main"
Android:id="@+id/my"
/>
<ListView
Android:layout_weight="7"
Android:layout_width="match_parent"
Android:layout_height="0dp"
Android:id="@+id/list_view_inside_nav"></ListView>
</LinearLayout>
</Android.support.design.widget.NavigationView>
</Android.support.v4.widget.DrawerLayout>
こんな感じ
Shubhamのコメントに応えて
ナビゲーションビューのようにヘッダービューはスクロールしません
LinearLayout
をNestedScrollView
の中に入れることで解決しました。これで、ヘッダーとともに適切にスクロールします。
<Android.support.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/nav_header_main" />
<Android.support.v7.widget.RecyclerView
Android:id="@+id/nav_list"
Android:layout_width="match_parent"
Android:layout_height="@dimen/weight_based_height"
Android:layout_weight="1"
Android:nestedScrollingEnabled="false"/>
</LinearLayout>
</Android.support.v4.widget.NestedScrollView>
この方法を試してください
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="true">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/nav_header" />
<ListView
Android:id="@+id/lst_menu_items"
Android:layout_width="match_parent"
Android:layout_height="0dp"
Android:layout_weight="1" />
</LinearLayout>