web-dev-qa-db-ja.com

NavigationViewにフッターを追加する方法-Androidサポートデザインライブラリ

フッター設定とプロファイルアイテムをNavitationViewに設定するにはどうすればよいですか?メールナビゲーションドロワーによる受信トレイのように見えます。 NavitationViewアイテムはメニューリソースによって拡張されますが、メニューアイテムにボトムアイテムを設定する方法がわかりません。または、カスタムビューをNavigationViewまたはボトムオフセットに設定するにはどうすればよいですか。この<LinearLayout...>をフッタービューとして配置しようとしましたが、小さな画面ではフッターがアイテムの上に置かれ、メニューをスクロールできません。フッターのパディングをNavigationViewに設定しようとしましたが、フッターもパディングを使用します。

これは小さな画面ではスクロールしません:

<Android.support.design.widget.NavigationView
    Android:id="@+id/drawer"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    app:headerLayout="@layout/kuona_drawer_header"
    app:menu="@menu/drawer">

    <LinearLayout...>

</Android.support.design.widget.NavigationView>

NOT SCROLLING

これはスクロールしますが、フッターはメニュー項目の上にあります:

<Android.support.design.widget.NavigationView
    Android:id="@+id/drawer"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:paddingBottom="96dp"
    app:headerLayout="@layout/kuona_drawer_header"
    app:menu="@menu/drawer">

    <LinearLayout...>

</Android.support.design.widget.NavigationView>

enter image description here

引き出しメニューres/menu/drawer.xmlファイル:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <group Android:checkableBehavior="single">
        <item
            Android:id="@+id/action_current_list"
            Android:checked="true"
            Android:icon="@drawable/ic_current_list"
            Android:title="@string/current_list" />
        <item
            Android:id="@+id/action_manage_lists"
            Android:icon="@drawable/ic_my_lists"
            Android:title="@string/my_lists" />
        <item
            Android:id="@+id/action_search_products"
            Android:icon="@drawable/ic_search_black_24dp"
            Android:title="@string/search_products" />
        <item
            Android:id="@+id/action_deals"
            Android:icon="@drawable/ic_product_promo"
            Android:title="@string/deals" />
    </group>
</menu>
103
epool

ナビゲーションメニューに固定(スクロールしない)フッターが必要な場合は、投稿したように、NavigationViewを別のレイアウトにラップする必要があります。 NavigationViewはFrameLayoutと同様に機能するため、NavigationViewメニュー項目の上に内部レイアウトを「積み重ねる」ことになります。次に、フッターアイテムにLinearLayoutを使用して配置する1つの方法を示します。

固定フッター

<Android.support.design.widget.NavigationView
    Android:id="@+id/drawer"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    app:headerLayout="@layout/drawer_header"
    app:menu="@menu/drawer">

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_gravity="bottom"
        Android:clickable="true"
        Android:orientation="vertical">
        <TextView
            Android:id="@+id/footer_item_1"
            Android:layout_width="match_parent"
            Android:layout_height="48dp"
            Android:gravity="center"
            Android:text="Footer Item 1" />
        <TextView
            Android:id="@+id/footer_item_2"
            Android:layout_width="match_parent"
            Android:layout_height="48dp"
            Android:gravity="center"
            Android:text="Footer Item 2" />
    </LinearLayout>

</Android.support.design.widget.NavigationView>

この例ではTextViewを使用しましたが、フッタービューには何でも使用できます。フッターアイテムがメニューの下部と重複しないようにするには、メニューリソースファイルの最後にダミーアイテムを追加します(これらは「スペーサー」のように機能します)。

res/menu/drawer.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <group>
        <item
            Android:id="@+id/nav_item_1"
            Android:icon="@drawable/ic_nav_item_1"
            Android:title="Nav Item 1" />
        <item
            Android:id="@+id/nav_item_2"
            Android:icon="@drawable/ic_nav_item_2"
            Android:title="Nav Item 2" />
        <item
            Android:id="@+id/nav_item_3"
            Android:icon="@drawable/ic_nav_item_3"
            Android:title="Nav Item 3" />
        <item
            Android:id="@+id/nav_item_4"
            Android:icon="@drawable/ic_nav_item_4"
            Android:title="Nav Item 4" />
        <item
            Android:id="@+id/footer_spacer_1"
            Android:checkable="false"
            Android:enabled="false"
            Android:orderInCategory="200"
            Android:title="" />
        <item
            Android:id="@+id/footer_spacer_2"
            Android:checkable="false"
            Android:enabled="false"
            Android:orderInCategory="200"
            Android:title="" />
    </group>
</menu>

最後に、実際のフッタービューのアクティビティにクリックリスナーを追加することを忘れないでください。

...
// Click listener for nav footer.
View navFooter1 = findViewById(R.id.footer_item_1);
navFooter1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do footer action
    }
});
View navFooter2 = findViewById(R.id.footer_item_2);
navFooter2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do footer action
    }
});
...

フッターのスクロール

ただし、フッターをNavigationViewの残りの部分でスクロールできるようにすると、より簡単になります(追加のレイアウトやクリックリスナーはありません)。フッターアイテムを一意の<group>としてメニューリソースファイルに追加するだけです(これにより (区切り線 が作成されます)。すべてが自動的に処理され、一緒にスクロールします。

res/menu/drawer.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <group Android:id="@+id/nav_menu">
        <item
            Android:id="@+id/nav_item_1"
            Android:icon="@drawable/ic_nav_item_1"
            Android:title="Nav Item 1" />
        <item
            Android:id="@+id/nav_item_2"
            Android:icon="@drawable/ic_nav_item_2"
            Android:title="Nav Item 2" />
        <item
            Android:id="@+id/nav_item_3"
            Android:icon="@drawable/ic_nav_item_3"
            Android:title="Nav Item 3" />
        <item
            Android:id="@+id/nav_item_4"
            Android:icon="@drawable/ic_nav_item_4"
            Android:title="Nav Item 4" />
    </group>
    <group Android:id="@+id/nav_footer">
        <item
            Android:id="@+id/nav_footer_1"
            Android:icon="@drawable/ic_footer_item_1"
            Android:title="Footer Item 1" />
        <item
            Android:id="@+id/nav_footer_2"
            Android:icon="@drawable/ic_footer_item_2"
            Android:title="Footer Item 2" />
    </group>
</menu>
134
hungryghost

解決方法のヒントをお伝えしますが、NavigationViewでテストする機会はありません。

サンプルレイアウトxml。

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="match_parent"
  Android:layout_height="match_parent"
  Android:clipToPadding="false"
  Android:paddingBottom="96dp">

  <TextView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="#6F00" />

  <TextView
    Android:layout_width="match_parent"
    Android:layout_height="96dp"
    Android:layout_gravity="bottom"
    Android:layout_marginBottom="-96dp"
    Android:background="#600F" />

</FrameLayout>

結果は次のとおりです。

enter image description here

トリックは、親にパディングを適用し、子にマイナスマージンを適用することです。


クイックトライ:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.NavigationView xmlns:Android="http://schemas.Android.com/apk/res/Android"
  xmlns:app="http://schemas.Android.com/apk/res-auto"
  Android:layout_width="match_parent"
  Android:layout_height="match_parent"
  Android:layout_gravity="start"
  Android:clipToPadding="false"
  Android:paddingBottom="96dp"
  app:headerLayout="@layout/sample_header"
  app:menu="@menu/sample_menu">


  <TextView
    Android:layout_width="match_parent"
    Android:layout_height="96dp"
    Android:layout_gravity="bottom"
    Android:layout_marginBottom="-96dp"
    Android:background="#600F"
    Android:gravity="center"
    Android:text="I STAND BY MY SELF" />

</Android.support.design.widget.NavigationView>

enter image description here

32
Mohammad Ersan

ネストされたナビゲーションビューの他の回答で説明されているアプローチに従って、いくつかの問題が発生しました。

  • 多くの項目がある場合、または横向きモードの場合、フッターはメニュー項目とオーバーラップしました
  • 実際のメニューに多くの項目がある場合、ネストされたNavigationViewはスクロール可能になりましたが、見た目は良くありませんでした
  • ネスト内に2つのNavigationViewがあるため、カスタムビューをフッターとして定義できませんでした。
  • ネストされたスクロールビューの処理は混乱しました(時には2つのスクロールバーが表示されるなど)
  • 固定フッターは常に最下部に配置する必要があります(メニュー項目の数が少ないだけでなく)

これらすべての問題に対する私の解決策は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout ...>

    <include layout="@layout/main_content"/>

    <Android.support.design.widget.NavigationView ...>

        <Android.support.v4.widget.NestedScrollView
            ...
            Android:fillViewport="true"
            Android:scrollbars="vertical">

            <LinearLayout
                ...
                Android:orientation="vertical">

                <Android.support.design.widget.NavigationView
                    ...
                    app:elevation="0dp"
                    app:headerLayout="@layout/nav_header"
                    app:menu="@menu/nav_menu">
                </Android.support.design.widget.NavigationView>

                <LinearLayout
                    Android:id="@+id/spacer_to_bottom"
                    ...
                    Android:layout_height="0dp"
                    Android:layout_weight="1">
                </LinearLayout>

                <include layout="@layout/nav_footer"></include>
            </LinearLayout>
        </Android.support.v4.widget.NestedScrollView>
    </Android.support.design.widget.NavigationView>
</Android.support.v4.widget.DrawerLayout>

ここで、NestedScrollViewは、サブNavigationViewのスクロール親として機能します。つまり、サブNavigationViewはスクロールバー自体を表示することはありませんが、コンテンツ全体がフラットな方法で表示されます。

レイアウト「spacer_to_bottom」は残りのすべてのスペースを埋めるので、メニューアイコンがほとんどなくても、フッターは下部にあります。

最後に、固定フッターがリニアレイアウトに追加されます。これは、実際のメニュー(サブナビゲーションビュー)、スペーサーから始まり、フッターが下部にあります。

ここでは、完全な動作例をAndroidStudio-Projectとして見つけることができます。 https://github.com/MarcDahlem/AndroidSidemenuFooterExample

特にナビゲーションドロワーはここにあります: https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

スクリーンショット:

Few itemsMany items

23
Adreamus

最も簡単な答えは、Drawerレイアウト内にボタンを追加し、navigationview.xmlで重力を下に設定することです。

コードは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.NavigationView
   xmlns:Android="http://schemas.Android.com/apk/res/Android"
   xmlns:app="http://schemas.Android.com/apk/res-auto"
   Android:id="@+id/navigation"
   Android:layout_width="200dp"
   Android:layout_height="match_parent"
   Android:layout_gravity="start"
   app:headerLayout="@layout/navigation_header"
   app:menu="@menu/menu_navigation">

     <Button
            Android:id="@+id/btn_sing_in"
            Android:layout_width="match_parent"
            Android:layout_height="50dp"
            Android:text="@string/sign_in"
            Android:layout_gravity="bottom"/>

</Android.support.design.widget.NavigationView>

here is the result

22
Mohammed Fadhl

コンテナナビゲーションビューレイアウトが必要です。その後、さらに2つのナビゲーションレイアウトを含める必要があります。それらを親レイアウトの上下に揃えます。

ナビゲーションビューは基本的にScrimFrameLayoutであり、ステータスバーとの相互作用が優れているため、FrameLayoutではなく親としてナビゲーションビューを使用することをお勧めします。

アクティビティの例を次に示します。

<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/layout_dashboard"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context=".MainActivity">

<!-- Activity content goes here -->

<Android.support.design.widget.NavigationView
    Android:id="@+id/navigation_drawer_container"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start">

    <Android.support.design.widget.NavigationView
        Android:id="@+id/navigation_drawer"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="top"
        app:menu="@menu/menu_navigation_drawer" />

    <Android.support.design.widget.NavigationView
        Android:id="@+id/navigation_drawer_bottom"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="bottom"
        app:menu="@menu/menu_navigation_drawer_bottom" />

</Android.support.design.widget.NavigationView>

あなたはそれについてもっと読むことができ、ここに例を見ることができます: http://blog.nitish.io/post/122633295558/Android-design-library-navigationview-with-top

16
Nitish Kasturia

NavigationViewにはフッターを追加する機能がありません。しかし、あなたはこのようなものを試すことができます、

<?xml version="1.0" encoding="utf-8"?>
<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_base"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

    <Android.support.design.widget.NavigationView
        Android:id="@+id/nav_view_container"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:fitsSystemWindows="false"
        Android:layout_gravity="start"
        >

        <Android.support.design.widget.NavigationView
            Android:id="@+id/nav_view"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:scrollbarAlwaysDrawVerticalTrack="true"
            Android:scrollbars="vertical"
            Android:isScrollContainer="true"
            app:headerLayout="@layout/nav_header_base"
            app:menu="@menu/activity_base_drawer"
            Android:layout_gravity="top"
            Android:layout_marginBottom="x"
            />

        <Android.support.design.widget.NavigationView
            Android:id="@+id/nav_view_footer"
            Android:layout_width="wrap_content"
            Android:layout_height="x"
            app:headerLayout="@layout/hear_layout"
            app:menu="@menu/menu_items"
            Android:scrollbars="none"
            Android:layout_gravity="bottom"
            />

    </Android.support.design.widget.NavigationView>

</Android.support.v4.widget.DrawerLayout>

フッターがリストの場合、

    app:headerLayout="@null"
    app:menu="@menu/activity_base_drawer_footer"

ただし、何らかのカスタムビューの場合は、

    app:headerLayout="@layout/my_cutom_footer_view"
    app:menu="@null"

また、この場合、x = height of your custom footer viewを設定する必要があります

それが役に立てば幸い。

10
Jay Nair

あなたのアプローチに従って、いくつかの小さな変更はあなたが達成したいものを助けることができます。

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_gravity="bottom"
    Android:background="@color/background_material_light">
    <TextView
       Android:id="@+id/footer_item"
       Android:layout_width="match_parent"
       Android:layout_height="?attr/listPreferredItemHeight"
       Android:background="?attr/selectableItemBackground"
       Android:gravity="center_vertical"
       Android:paddingLeft="?attr/listPreferredItemPaddingLeft"
       Android:text="Something"
       Android:textAppearance="?attr/textAppearanceListItem" />
</LinearLayout>

また、メニューにいくつかのスタブ項目を設定して、メニュー項目が重ならないようにします。

<group>
    ...
    <item
        Android:title=""
        Android:orderInCategory="200"/>
</group>

また、フッターアイテムにクリックリスナーを追加することもできます。

6
razzledazzle

私はその遅い答えを知っていますが、ほとんどの開発者が探している完璧で正確な答えを知っています。

ナビゲーションビューにフッターを追加するには、以下のようにカスタムビューをナビゲーションメニューに追加します。

footer_navigation_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal">

    <Android.support.v7.widget.AppCompatTextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:text="@string/version" />

    <Android.support.v7.widget.AppCompatTextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentRight="true"
        Android:gravity="right" />

</RelativeLayout>

次に、グループ属性を使用して上記のビューをメニューxmlに追加します。そのため、メニューのフッターとして区別できます。

profile_menu.xml

<group Android:checkableBehavior="single">

    <item
        Android:id="@+id/nav_support"
        Android:title="@string/nav_item_support" />

    <item
        Android:id="@+id/nav_settings"
        Android:title="@string/nav_item_settings" />

    <item
        Android:id="@+id/nav_log_out"
        Android:title="@string/nav_item_log_out" />
</group>
<group
    Android:id="@+id/nav_footer">
    <item
        Android:id="@+id/nav_log_version"
        app:actionLayout="@layout/footer_navigation_menu" />
</group>

それでおしまい。出力は次のとおりです。

enter image description here

6
Sagar Maiyad

NavigationView最初の子は、ヘッダーとメニュー項目の両方を含むListViewです。

フッターを追加するために必要なのは、ListViewに.addFooterViewを呼び出すことだけです

詳細: http://www.andreabaccega.com/blog/2015/08/28/how-to-add-footer-to-navigationview/

貼り付けコードをコピー:

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ListView listView = (ListView) navigationView.getChildAt(0);
    View toRet = LayoutInflater.from(view.getContext()).inflate(R.layout.drawer_footer, listView, false);

    // Manipulate the view (if you need to) before calling addFooterView.

    listView.addFooterView(toRet, null, false);
  }
5
Andrea Baccega

フッターとスクロールメニューを修正したソリューション(100%テスト済み)

 <Android.support.design.widget.NavigationView
    Android:id="@+id/container_navigation"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity=""
    Android:nestedScrollingEnabled="true"
    Android:scrollIndicators="none">

    <RelativeLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <Android.support.design.widget.NavigationView
            Android:id="@+id/navigation"
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"
            Android:layout_above="@+id/navigation2"
            Android:layout_gravity="top"
            Android:nestedScrollingEnabled="true"
            Android:paddingBottom="@dimen/dimen_20_dp"
            app:headerLayout="@layout/nav_header"
            app:itemIconTint="@color/black_800"
            app:itemTextColor="@color/black_800"
            app:menu="@menu/navigation_drawer_items">

        </Android.support.design.widget.NavigationView>

        <Android.support.design.widget.NavigationView
            Android:id="@+id/navigation2"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentBottom="true">

            <LinearLayout
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_gravity="bottom"
                Android:background="@color/white_100"
                Android:orientation="horizontal">

                <TextView
                    Android:id="@+id/empty_spacer"
                    Android:layout_width="0dp"
                    Android:layout_height="wrap_content"
                    Android:layout_weight="1"
                    Android:drawableTop="@drawable/ic_search"
                    Android:gravity="center"
                    Android:text="Share" />

                <TextView
                    Android:id="@+id/mnuRate"
                    Android:layout_width="0dp"
                    Android:layout_height="wrap_content"
                    Android:layout_weight="1"
                    Android:drawableTop="@drawable/ic_search"
                    Android:gravity="center"
                    Android:text="Rate" />

                <TextView
                    Android:id="@+id/mnuHelp"
                    Android:layout_width="0dp"
                    Android:layout_height="wrap_content"
                    Android:layout_weight="1"
                    Android:drawableTop="@drawable/ic_search"
                    Android:gravity="center"
                    Android:text="Help" />
            </LinearLayout>
        </Android.support.design.widget.NavigationView>

    </RelativeLayout>

</Android.support.design.widget.NavigationView>
5
RD1819

これは、ナビゲーションの下部にレイアウトを追加する方法です:

    <Android.support.design.widget.NavigationView
    Android:id="@+id/navigation_drawer_container"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start">

    <Android.support.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:fillViewport="true">

        <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent">

            <LinearLayout
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:orientation="vertical"
                Android:weightSum="1">

                <Android.support.design.widget.NavigationView
                    Android:id="@+id/nav_view"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_alignParentTop="true"
                    Android:layout_gravity="top"
                    Android:layout_weight="0.8"
                    app:headerLayout="@layout/nav_header_home"
                    app:menu="@menu/activity_home_drawer" />

                <Android.support.design.widget.NavigationView
                    Android:id="@+id/navigation_drawer_bottom"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_alignParentBottom="true"
                    Android:layout_below="@+id/nav_view"
                    Android:layout_weight="0.2">

                    <LinearLayout
                        Android:id="@+id/linearLayout"
                        Android:layout_width="match_parent"
                        Android:layout_height="wrap_content"
                        Android:layout_alignParentBottom="true"
                        Android:layout_below="@+id/scrollView"
                        Android:orientation="vertical">

                        <TextView
                            Android:id="@+id/text_dashboard_followUsAt"
                            Android:layout_width="wrap_content"
                            Android:layout_height="wrap_content"
                            Android:paddingLeft="16dp"
                            Android:paddingStart="16dp"
                            Android:text="Follow us at" />

                        <LinearLayout
                            Android:layout_width="wrap_content"
                            Android:layout_height="wrap_content"
                            Android:orientation="horizontal"
                            Android:paddingLeft="16dp"
                            Android:paddingStart="16dp">

                            <ImageView
                                Android:layout_width="wrap_content"
                                Android:layout_height="wrap_content"
                                Android:padding="5dp"
                                Android:src="@drawable/fb" />

                            <ImageView
                                Android:layout_width="wrap_content"
                                Android:layout_height="wrap_content"
                                Android:padding="5dp"
                                Android:src="@drawable/fb" />

                            <ImageView
                                Android:layout_width="wrap_content"
                                Android:layout_height="wrap_content"
                                Android:padding="5dp"
                                Android:src="@drawable/fb" />
                        </LinearLayout>

                        <TextView
                            Android:id="@+id/text_dashboard_version"
                            Android:layout_width="wrap_content"
                            Android:layout_height="wrap_content"
                            Android:layout_gravity="end"
                            Android:layout_marginTop="25dp"
                            Android:paddingBottom="5dp"
                            Android:paddingEnd="16dp"
                            Android:paddingRight="16dp"
                            Android:text="Version 1.0" />
                    </LinearLayout>
                </Android.support.design.widget.NavigationView>
            </LinearLayout>
        </RelativeLayout>
    </Android.support.v4.widget.NestedScrollView>
</Android.support.design.widget.NavigationView>
2
zohaib khaliq

私は次の方法で同じことを作りました

    <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"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"
        >

        <LinearLayout Android:layout_gravity="bottom"
            Android:background="#20191d1e"
            Android:layout_width="match_parent"
            Android:paddingBottom="2dp"
            Android:paddingLeft="@dimen/activity_horizontal_margin"
            Android:paddingRight="@dimen/activity_horizontal_margin"
            Android:paddingTop="2dp"
            Android:orientation="horizontal"
            Android:layout_height="wrap_content">

            <ImageView
                Android:id="@+id/company_image_id"
                Android:layout_width="50dp"
                Android:layout_height="50dp"
                Android:layout_margin="@dimen/margin1dp"
                Android:padding="@dimen/margin2dp"
                Android:src="@mipmap/ic_launcher_round"
                />

            <TextView
                Android:id="@+id/txtCompanyName"
                Android:layout_width="match_parent"                              Android:layout_marginLeft="@dimen/margin3dp"
                Android:layout_height="wrap_content"
                Android:textSize="13dp" Android:layout_gravity="center"
                Android:textStyle="bold"
                Android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
        </LinearLayout>
    </Android.support.design.widget.NavigationView>

</Android.support.v4.widget.DrawerLayout>

ここでの主なことは、レイアウトの重力を下に置くことです。

**LinearLayout Android:layout_gravity="bottom"**

11

2

私はこのフォームを使用します。横向きと縦向き。

<Android.support.design.widget.NavigationView
    Android:id="@+id/nav_view"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start">

    <LinearLayout
        Android:orientation="vertical"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <Android.support.design.widget.NavigationView
            Android:id="@+id/navigation"
            Android:layout_width="wrap_content"
            Android:layout_height="0dp"
            Android:layout_weight="1"
            app:headerLayout="@layout/master_main_header"
            app:itemIconTint="@color/blue"
            app:menu="@menu/menu_drawer">

        </Android.support.design.widget.NavigationView>

        <Button
            Android:id="@+id/master_btn_closession"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="0"
            Android:background="@color/blue"
            Android:text="Cerrar sesión" />
    </LinearLayout>
</Android.support.design.widget.NavigationView>
2
Alex Zaraos

これを使って..

<Android.support.design.widget.NavigationView
    Android:id="@+id/navigation"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    app:headerLayout="@layout/nav_header"
    app:itemIconTint="@color/accent"
    app:itemTextColor="@color/primary_text"
    app:menu="@menu/navigation_drawer_items">

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_gravity="bottom"
        Android:background="@color/grey_200"
        Android:orientation="vertical">

        <View
            Android:layout_width="match_parent"
            Android:layout_height="@dimen/divider_height"
            Android:background="@color/grey_600"/>

        <com.facebook.share.widget.LikeView
            Android:id="@+id/like_view"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_gravity="start"
            Android:padding="@dimen/small"/>

        <com.facebook.login.widget.LoginButton
            Android:id="@+id/login_button"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_margin="@dimen/small"/>
    </LinearLayout>
</Android.support.design.widget.NavigationView>

次に、下部のパディングをNavigationMenuViewに設定します

final View menuView = navigationView.getChildAt(0);
final View bottomView = navigationView.getChildAt(1);
bottomView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            menuView.setPadding(0, 0, 0, bottomView.getMeasuredHeight());
        }
    });
2

これを試してください、これは私のために働きます。

<Android.support.design.widget.NavigationView
                    Android:id="@+id/nav_view1"
                    Android:layout_width="wrap_content"
                    Android:layout_height="match_parent"
                    Android:layout_gravity="start"
                    Android:fitsSystemWindows="true">

                    <ScrollView
                        Android:layout_width="wrap_content"
                        Android:layout_height="match_parent">

                    <LinearLayout
                        Android:layout_width="wrap_content"
                        Android:layout_height="match_parent"
                        Android:orientation="vertical">

                        <Android.support.design.widget.NavigationView
                            Android:layout_width="wrap_content"
                            Android:layout_height="match_parent"
                            Android:id="@+id/nav_view"
                            app:headerLayout="@layout/nav_header_admin"
                            app:menu="@menu/activity_admin_drawer"/>

                        <LinearLayout
                            Android:layout_width="match_parent"
                            Android:layout_height="match_parent"
                            Android:orientation="vertical"
                            Android:id="@+id/lyNavFooter">

                           <!--INCLUDE YOUR FOOTER HERE -->

                        </LinearLayout>
                    </LinearLayout>

                    </ScrollView>



                </Android.support.design.widget.NavigationView>
2
RdlP

NavigationView内に別のレイアウトを配置するだけです。

<Android.support.design.widget.NavigationView 
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:background="#000000"
        app:itemTextColor="#FFFFFF"
        app:headerLayout="@layout/fragment_side_menu_header"
        app:menu="@menu/side_menu">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        Android:layout_gravity="bottom">
        <TextView
            Android:textColor="#FFFFFF"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="test" />
        <TextView
            Android:textColor="#FFFFFF"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="test2" />
    </LinearLayout>
</Android.support.design.widget.NavigationView>

トリックは、layout_gravity = "bottom"を使用することです。これにより、レイアウト全体が下部に配置され、test、test2が適切にスタックされます。

2
McOzD

これを試してください、これは私のために働いています. https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

ただし、スムーズなスクロールのためにNavigationViewScrollingを無効にする

private void disableNavigationViewScrolling(NavigationView navigationView) {
    if (navigationView != null) {
        NavigationMenuView navigationMenuView = (NavigationMenuView) navigationView.getChildAt(0);
        if (navigationMenuView != null) {
            navigationMenuView.setNestedScrollingEnabled(false);
        }
    }
}

スクリーンショット:

1
JB Pha Le

引き出しメニューの固定ヘッダーとフッターのレイアウト構造:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout>

    <Android.support.design.widget.AppBarLayout>
        <Android.support.v7.widget.Toolbar/>
    </Android.support.design.widget.AppBarLayout>

    <LinearLayout>
        <include layout="@layout/drawer_header"/>
        <Android.support.design.widget.NavigationView/>
        <include layout="@layout/drawer_footer"/>
    </LinearLayout>

</Android.support.v4.widget.DrawerLayout>

完全なレイアウト:

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <Android.support.design.widget.AppBarLayout
        Android:id="@+id/app_bar_layout"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:theme="@style/AppTheme.AppBarOverlay"
        app:elevation="0dp">
        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" >
        </Android.support.v7.widget.Toolbar>
    </Android.support.design.widget.AppBarLayout>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="@color/white"
        Android:layout_gravity="start"
        Android:orientation="vertical">
        <include layout="@layout/drawer_menu_header"/>

        <Android.support.design.widget.NavigationView
            Android:id="@+id/drawer_menu_body"
            app:elevation="0dp"
            Android:layout_height="0dp"
            Android:layout_width="match_parent"
            Android:layout_weight="1"
            Android:background="@color/white"
            Android:theme="@style/AppTheme.PopupOverlay"
            app:menu="@menu/main_drawer">
        </Android.support.design.widget.NavigationView>

        <include layout="@layout/drawer_menu_footer"/>
    </LinearLayout>

</Android.support.v4.widget.DrawerLayout>
1
s-hunter
<include
    layout="@layout/app_bar_main"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

<Android.support.design.widget.NavigationView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:fitsSystemWindows="true"
    app:menu="@menu/activity_main_drawer">

    <Android.support.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:fillViewport="true"
        Android:scrollbars="vertical">

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:orientation="vertical">

            <Android.support.design.widget.NavigationView
                Android:id="@+id/nav_view"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                app:elevation="0dp"
                app:headerLayout="@layout/nav_header_main"
                app:menu="@menu/activity_main_drawer">
                ></Android.support.design.widget.NavigationView>

            <LinearLayout
                Android:id="@+id/spacer_to_bottom"
                Android:layout_width="match_parent"
                Android:layout_height="0dp"
                Android:layout_weight="1"
                Android:orientation="vertical" />

        </LinearLayout>
    </Android.support.v4.widget.NestedScrollView>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_gravity="bottom"
        Android:layout_marginBottom="0dp">

        <include layout="@layout/nav_footer_main" />

    </LinearLayout>
</Android.support.design.widget.NavigationView>
1
user5780466

これは、ナビゲーションドロワーのフッターに画像を配置するために働いています(縦向きと横向き)

    <?xml version="1.0" encoding="utf-8"?>
        <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_main3"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent" />

            <Android.support.design.widget.NavigationView
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:layout_gravity="start"
                Android:background="#f00"
                Android:fitsSystemWindows="true"
                app:menu="@menu/activity_main3_drawer">

                <Android.support.v4.widget.NestedScrollView
                    Android:layout_width="match_parent"
                    Android:fillViewport="true"
                    Android:layout_height="match_parent"
                    Android:scrollbars="vertical">

                    <LinearLayout
                        Android:layout_width="match_parent"
                        Android:layout_height="wrap_content"
                        Android:orientation="vertical">

                        <Android.support.design.widget.NavigationView
                            Android:id="@+id/nav_view"
                            app:elevation="0dp"
                            Android:layout_height="wrap_content"
                            Android:layout_width="match_parent"
                                Android:background="#ff0"
                            app:headerLayout="@layout/nav_header_main3"
                            app:menu="@menu/activity_main3_drawer">
                            ></Android.support.design.widget.NavigationView>

                        <LinearLayout
                            Android:id="@+id/spacer_to_bottom"
                            Android:layout_width="match_parent"
                            Android:orientation="vertical"
                            Android:background="#0f0"
                            Android:layout_height="0dp"
                            Android:layout_weight="1">
                            <include layout="@layout/nav_footer_main3"></include>
                        </LinearLayout>


                    </LinearLayout>
                </Android.support.v4.widget.NestedScrollView>
            </Android.support.design.widget.NavigationView>

        </Android.support.v4.widget.DrawerLayout>

私のnav_footer_main3は

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:orientation="vertical" Android:layout_width="match_parent"
        Android:layout_height="60dp">
        <ImageView
            Android:id="@+id/imageView"
            Android:layout_gravity="center_horizontal"
            Android:layout_width="200dp"
            Android:layout_height="50dp"
            Android:background="@drawable/logo_1" />
    </LinearLayout>
1

固定ヘッダーとフッターの個人的なソリューションは、NavigationViewを次のように拡張します。

/**
 * Created by guness on 17.01.2018.
 */
class NavigationView : Android.support.design.widget.NavigationView {

private var mHeader: View? = null
private var mFooter: View? = null
private var mMenuView: NavigationMenuView? = null

constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
    val a = TintTypedArray.obtainStyledAttributes(context, attrs,
            R.styleable.NavigationView, defStyleAttr,
            R.style.Widget_Design_NavigationView)

    if (a.hasValue(R.styleable.NavigationView_footerLayout)) {
        inflateFooterView(a.getResourceId(R.styleable.NavigationView_footerLayout, 0))
    }

    a.recycle()

    (mFooter?.layoutParams as FrameLayout.LayoutParams?)?.gravity = Gravity.BOTTOM
}

init {
    (0 until childCount)
            .map { getChildAt(it) }
            .filter { it is NavigationMenuView }
            .forEach {
                mMenuView = it as NavigationMenuView
                mMenuView!!.overScrollMode = View.OVER_SCROLL_NEVER
            }
}

override fun inflateHeaderView(@LayoutRes res: Int): View {
    mHeader = LayoutInflater.from(context).inflate(res, this, false)
    setHeaderView(mHeader!!)
    return mHeader!!
}

@Deprecated("There can only be one header", ReplaceWith("#setHeaderView(view: View)"))
override fun addHeaderView(view: View) {
    throw IllegalAccessException("Please use #setHeaderView")
}

@UiThread
fun setHeaderView(view: View) {
    removeHeaderView()
    mHeader = view
    addView(mHeader, 0)
}

@Deprecated("No need to use params", ReplaceWith("#removeHeaderView()"))
override fun removeHeaderView(view: View) {
    removeHeaderView()
}

@UiThread
fun removeHeaderView() {
    if (mHeader != null) {
        removeView(mHeader)
        mHeader = null
    }
}

@Deprecated("No need to count, it is either 1 or zero", ReplaceWith("#hasHeader()"))
override fun getHeaderCount(): Int {
    return if (mHeader == null) 0 else 1
}

@Deprecated("No need to use params", ReplaceWith("#getHeaderView()"))
override fun getHeaderView(index: Int): View? {
    return getHeaderView()
}

fun getHeaderView(): View? {
    return mHeader
}

fun hasHeader(): Boolean {
    return mHeader != null
}

fun inflateFooterView(@LayoutRes res: Int): View {
    mFooter = LayoutInflater.from(context).inflate(res, this, false)
    setFooterView(mFooter!!)
    return mFooter!!
}

@UiThread
fun setFooterView(view: View) {
    removeFooterView()
    mFooter = view
    addView(mFooter, 0)
}

@UiThread
fun removeFooterView() {
    if (mFooter != null) {
        removeView(mFooter)
        mFooter = null
    }
}

fun hasFooter(): Boolean {
    return mFooter != null
}

fun getFooterView(): View? {
    return mFooter
}

fun setOnClickListener(@IdRes res: Int, listener: View.OnClickListener) {
    mHeader?.findViewById<View>(res)?.setOnClickListener(listener)
    mFooter?.findViewById<View>(res)?.setOnClickListener(listener)
}

override fun onMeasure(widthSpec: Int, heightSpec: Int) {
    super.onMeasure(widthSpec, heightSpec)
    val headerHeight = mHeader?.measuredHeight ?: 0
    val footerHeight = mFooter?.measuredHeight ?: 0
    val params = (mMenuView?.layoutParams as ViewGroup.MarginLayoutParams?)
    var changed = false
    if (params?.topMargin != headerHeight) {
        params?.topMargin = headerHeight
        changed = true
    }
    if (params?.bottomMargin != footerHeight) {
        params?.bottomMargin = footerHeight
        changed = true
    }
    if (changed) {
        mMenuView!!.measure(widthSpec, heightSpec)
    }
}
}

本来、NavigationViewは、RecyclerViewの最初のアイテムとしてLinearLayoutを作成し、すべてのコンテンツを一緒にスクロールします。これに関するアイデアは、フッターとヘッダーに別々のビューを作成し、Gravityを使用してそれらを上下にプッシュすることです。後で、RecyclerViewのコンテンツを測定して、スクロールするコンテンツを確定します。

以下は、私が書いた上記のコードを含むライブラリです。 https://github.com/guness/NavigationView

これの良い面は、ネイティブのヘッダーと同じように、xmlでフッタービューを定義できるようになりました。

    app:footerLayout="@layout/nav_footer_main"
    app:headerLayout="@layout/nav_header_main"
0
guness

バージョン> 23.x.xのスクロールフッター

最終的に私は望んでいたものを達成することができましたが、残念ながら、リストビューへの参照を取得し、23.x.xより下のバージョンのようにヘッダーとフッターを追加することはもはや不可能に見えます(Andrea Baccegaによる)。ヘッダーに対してこれを行うことはまだ可能です:

     <Android.support.design.widget.NavigationView
     ..
     app:headerLayout="@layout/item_drawer_footer"
     ..
     />

ただし、現時点ではフッターを追加することはできません。ただし、フッターを追加しようとしている場合の回避策が見つかりました。ビューを逆にすると、ヘッダーが下部に追加され、通常のフッターのように動作します。必ず逆の順序でメニューを作成してください

    // Grab reference to the embedded recycler view
    RecyclerView mRecyclerView = (RecyclerView) navigationView.getChildAt(0);

    // Create a LinearLayoutManager and set it to reversed
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
    mLayoutManager.setReverseLayout(true);

    // Apply layout manager to the recycler view
    mRecyclerView.setLayoutManager(mLayoutManager);
0
Lukas