Bagaimana cara menambahkan footer ke NavigationView - pustaka desain dukungan Android?

122

Bagaimana cara mengatur pengaturan footer dan item profil NavitationView? agar terlihat seperti laci navigasi Inbox by email. The NavitationViewitem yang digelembungkan oleh sumber daya menu, tapi saya tidak tahu cara mengatur item bawah untuk sumber daya menu, atau bagaimana saya bisa mengatur tampilan kustom untuk NavigationViewatau bawah offset? Saya telah mencoba menempatkan ini <LinearLayout...>sebagai tampilan footer, tetapi pada layar kecil footer meletakkan item dan saya tidak dapat menggulir menu, saya telah mencoba memasang bantalan footer NavigationView, tetapi footer mengambil bantalan juga.

Ini tidak bergulir di layar kecil:

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

TIDAK BERGULIR

Ini menggulung, tetapi footer berada di atas item menu:

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

masukkan deskripsi gambar di sini

res/menu/drawer.xmlFile menu laci :

<?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>
epool
sumber
Di lokasi mana Anda telah meletakkan file @ menu / drawer ..
Psypher
Ada di/res/menu/drawer.xml
epool
Apakah ada alasan mengapa Anda tidak dapat melakukan "Umpan Balik" dan "Keluar" sebagai item menu? Jika alasannya adalah Anda ingin mengubah ikon menu untuk "Keluar" secara dinamis, Anda dapat melakukannya dengan menuItem.setIcon(Drawable).
laparghost
Ini hanya untuk persyaratan, dan secara pribadi saya ingin tahu bagaimana Google melakukan ini di aplikasi kotak masuk misalnya.
epool
Pertanyaan ini menjadi lebih penting dengan pembaruan 23.1
Alex Sorokoletov

Jawaban:

151

Jika Anda menginginkan footer tetap (non-scrolling) di menu navigasi, Anda perlu membungkus NavigationView di sekitar tata letak lain, seperti yang Anda posting. NavigationView bekerja seperti FrameLayout, jadi ini akhirnya "menumpuk" tata letak bagian dalam di atas item menu NavigationView. Berikut salah satu cara untuk mengaturnya, menggunakan LinearLayout untuk item footer:

Footer Tetap

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

Saya menggunakan TextView dalam contoh ini, tetapi Anda dapat menggunakan apa pun yang Anda inginkan untuk tampilan footer. Untuk menghindari item footer tumpang tindih dengan bagian bawah menu, tambahkan beberapa item dummy ke akhir file sumber daya menu Anda (ini akan bertindak seperti "spacer"):

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>

Terakhir, jangan lupa untuk menambahkan listener klik di Aktivitas Anda untuk tampilan footer yang sebenarnya:

...
// 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
    }
});
...

Scrolling Footer

Jika Anda mengizinkan footer untuk menggulir dengan NavigationView lainnya, itu membuat segalanya lebih sederhana (tidak ada tata letak tambahan atau pendengar klik). Cukup tambahkan item footer ke file sumber menu Anda sebagai yang unik <group>(ini akan membuat garis pemisah ), dan semuanya akan ditangani secara otomatis dan gulir bersama:

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>
kelaparan
sumber
1
Ini hanya untuk persyaratan, dan secara pribadi saya ingin tahu bagaimana Google melakukan ini di aplikasi kotak masuk misalnya.
epool
Saya tidak yakin bagaimana Google melakukannya di aplikasi gmail, tetapi dari penampilan, sepertinya seperti yang saya jelaskan di jawaban. Gunakan terpisah <group> jika Anda menginginkan garis pemisah, jika tidak, footer navigasi aplikasi Gmail hanya terlihat seperti item menu normal (setidaknya bagi saya).
kelaparan
1
Ahh, saya mengerti sekarang. Saya pikir Anda sedang berbicara tentang aplikasi gmail. Saya belum menginstal aplikasi kotak masuk, tetapi jika Anda mencari footer statis, maka Anda benar, Anda harus menggunakan tata letak terpisah. Itu seharusnya tidak terlalu sulit. Mari kita lihat ...
hungghost
7
Anda dapat menggunakan <dimen name="design_navigation_padding_bottom" tools:override="true">48dp</dimen> dalam dimen.xmlalih-alih menggunakan item dummy dalam menu! itu sempurna !
Omid
1
Bagaimana cara mengatur fonta item laci dan ukuran font untuk footer textview?
JEGADEESAN S
37

Saya hanya akan memberi Anda petunjuk cara mengatasinya, tetapi saya tidak memiliki kesempatan untuk mengujinya di NavigationView, dan saya cukup yakin ini akan berhasil.

di sini contoh tata letak 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>

inilah hasilnya:

masukkan deskripsi gambar di sini

Caranya adalah dengan mengaplikasikan padding pada parent dan minus margin pada child.


Coba cepat:

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

masukkan deskripsi gambar di sini

Mohammad Ersan
sumber
3
Ini mungkin berhasil, tetapi margin negatif cukup berbahaya. Jadi, secara pribadi, saya menghindarinya jika memungkinkan.
kelaparan
Di footer ini, jika Anda meletakkan ikon di tengah "botom" Anda dapat mengubah tergantung pada layar dan akan dipotong, lihat posting ini stackoverflow.com/questions/32460312/…
delive
Bisakah Anda memberikan tautan tentang contoh lengkap?
delive
bisakah kita mengaturnya agar bisa digulir?
Ahmad Shahwaiz
27

Mengikuti pendekatan yang dijelaskan dalam jawaban lain dari tampilan navigasi bersarang, beberapa masalah muncul:

  • Dengan banyak item, atau dalam mode lanskap, footer tumpang tindih dengan item menu
  • Jika menu sebenarnya memiliki banyak item, NavigationView bersarang dapat digulir, yang tidak terlihat bagus
  • Memiliki dua NavigationView dalam penumpukan, tidak memungkinkan untuk mendefinisikan tampilan kustom sebagai footer.
  • Penanganan tampilan gulir bersarang berantakan (terkadang dua bilah gulir muncul dll)
  • Footer Tetap harus selalu di bagian bawah (dengan sedikit dan juga dengan banyak item menu)

Solusi saya untuk semua masalah ini adalah sebagai berikut:

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

Di sini, NestedScrollView bertindak sebagai induk pengguliran untuk sub-NavigationView. Artinya, sub-NavigationView tidak pernah menampilkan scrollbar itu sendiri, tetapi seluruh konten ditampilkan dengan cara datar.

Tata letak 'spacer_to_bottom' mengisi semua ruang yang tersisa, sehingga dengan beberapa ikon menu, footer masih berada di bawah.

Terakhir, footer tetap ditambahkan ke linear layout, yang dimulai dengan menu nyata (sub-NavigationView), spacer, dan di bagian bawah footer.

Di sini Anda dapat menemukan contoh kerja lengkap sebagai AndroidStudio-Project: https://github.com/MarcDahlem/AndroidSidemenuFooterExample

Terutama laci navigasi dapat ditemukan di sini: https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

Tangkapan layar:

Beberapa item Banyak item

Adreamus
sumber
Apa sebenarnya yang tidak berhasil? Saya dapat memberikan contoh proyek jika diperlukan, yang bekerja sangat baik dengan footer bergulir. @AndreaBcega
Adreamus
Saya setuju dengan @AndreaBaccega, tidak berfungsi, hanya menampilkan menu navigasi dan tidak menampilkan footer
RdlP
oke, yang kedua dengan masalah. Saya akan membuat proyek contoh dan mengunggahnya ke github. cu soon
Adreamus
Saya menambahkan proyek contoh di github: github.com/MarcDahlem/AndroidSidemenuFooterExample
Adreamus
Suara positif besar untuk atribut elevasi. Saya pergi dengan pendekatan yang sama, tetapi tidak bisa menghilangkan bayangan bawah. Kemudian, saya menemukan ini. Terima kasih!
Elvedin Selimoski
23

Jawaban paling sederhana adalah menambahkan tombol di dalam layout Drawer dan mengatur gravitasi ke bawah di navigationview.xml.

Ini kodenya:

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

inilah hasilnya

Mohammed Fadhl
sumber
2
Untuk beberapa item menu, ini mungkin berhasil. Namun begitu Anda memiliki banyak item menu, tombol tersebut akan tumpang tindih dengan item menu di perangkat kecil atau dalam mode lanskap.
Adreamus
1
Namun benar untuk mengatasi hal ini Anda dapat meletakkan item menu kosong.
Mohammed Fadhl
untuk menyesuaikan bagian bawah dengan item menu kosong untuk screensize yang berbeda hampir mungkin. Tetapi ada cara umum untuk melakukan ini seperti yang saya jelaskan dalam solusi saya ;-) -> lihat solusi saya stackoverflow.com/a/37714353/1075072
Adreamus
17

Anda harus memiliki tata letak tampilan navigasi kontainer dan kemudian itu harus berisi dua tata letak navigasi lagi. Anda menyelaraskannya ke atas dan bawah tata letak induk.

Saya akan merekomendasikan menggunakan tampilan navigasi sebagai induk dan bukan FrameLayout karena pada dasarnya ini adalah ScrimFrameLayout dan berinteraksi dengan bilah status dengan lebih baik.

Berikut adalah contoh tampilan aktivitas Anda:

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

Anda dapat membaca lebih lanjut tentang itu dan melihat contohnya di sini: http://blog.nitish.io/post/122633295558/android-design-library-navigationview-with-top

Nitish K.
sumber
1
Ini benar-benar solusi yang bagus. Tapi bungkus konten tidak berfungsi di NavigationView atas dan bawah. Anda harus memberikan ketinggian yang konstan untuk mencegah NavigationView memblokir bagian atas NavigationView.
Olcay Ertaş
solusi sempurna
Bolein95
@Nitish cara menghindari tumpang tindih ketika "@ + id / navigation_drawer" memiliki lebih banyak nilai dalam mode potret. itu berada di belakang tampilan navigasi bawah. Dalam kasus saya, item menu navigasi atas diisi secara dinamis, tampilan navigasi bawah memiliki nilai menu statis.
MohanRaj S
14

Saya tahu jawabannya yang terlambat tetapi jawaban yang sempurna dan akurat yang dicari sebagian besar pengembang.

Untuk menambahkan footer dalam tampilan navigasi, Tambahkan tampilan kustom ke menu navigasi seperti di bawah ini:

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>

Sekarang tambahkan tampilan di atas ke dalam menu xml Anda dengan atribut group, sehingga dapat dibedakan sebagai footer pada menu.

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>

Itu dia. Di bawah ini adalah keluarannya:

masukkan deskripsi gambar di sini

Sagar Maiyad
sumber
Ini tidak akan berfungsi dalam kasus tampilan bawah yang rumit karena memberikan ketinggian tetap ke tampilan bawah.
Akash Bisariya
Ini mungkin berhasil, tetapi tidak ada cara untuk menyetel onClickListeners ke tampilan di dalam tata letak footer ... Dalam kasus saya, saya memiliki tombol media sosial di footer yang mengirim ke url eksternal, tetapi tidak dapat memperoleh tampilan menggunakan id mereka dengan cara apa pun Aku bisa memikirkan ...
Ramiro GM
12

Agak mengecewakan bahwa NavigationView tidak memiliki ketentuan untuk menambahkan footer. Tapi Anda bisa mencoba sesuatu seperti ini,

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

Jika footer Anda berupa daftar,

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

Tapi, jika itu semacam tampilan ubahsuaian,

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

Juga, dalam hal ini, Anda perlu mengatur x = height of your custom footer view

Semoga membantu.

Jay Nair
sumber
Terima kasih bro. Anda membuat hari saya .. :)
SiddharthG
3
3 Tampilan Navigasi? Mengapa? Untuk penampilan terburuk? Silakan, tonton beberapa video ini: youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
Louis CAD
@LouisCAD Jika Anda memiliki solusi yang benar-benar berfungsi, tanpa margin negatif, silakan bagikan dengan kami. Saya memiliki masalah yang disebutkan di sini, dan ini adalah satu-satunya solusi yang saya pertimbangkan. Mungkin bukan solusi yang tepat, dan mungkin berdampak pada kinerja ... tetapi tanpa penerapan lain, jangan hanya berkomentar tentang masalah kinerja. Pertama-tama, persyaratan aplikasi penting. Jika Google tidak memberikan solusi untuk kebutuhan aplikasi Anda ... Anda tidak memiliki banyak pilihan.
Dascalescu Vladut
10

masukkan deskripsi gambar di siniSaya membuat hal yang sama dengan cara berikut:

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

Di sini hal utama adalah bahwa saya meletakkan tata letak gravitasi ke bawah misalnya

LinearLayout android:layout_gravity="bottom"
Manjeet Singh Goyal
sumber
Dengan solusi ini, tampilan bawah akan melayang di atas item menu (jika ada beberapa item menu) ... Tapi saya ingin memperbaiki di bagian bawah.
Akash Bisariya
7

Mengikuti pendekatan Anda, beberapa perubahan kecil dapat membantu apa yang ingin Anda capai.

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

Dan atur beberapa item stub di menu, sehingga item menu tidak tumpang tindih.

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

Anda juga ingin menambahkan listener klik ke item footer Anda.

razzledazzle
sumber
Terima kasih atas jawaban Anda, ini memberi saya solusi untuk menambahkan footer saya, tetapi saya harap menerima jawaban Anda jika tidak ada yang memberi saya jawaban yang lebih baik untuk melakukan lebih baik. +1
epool
Jaga agar pilihan Anda tetap terbuka. Menantikan jawaban yang lebih baik juga karena footer itu penting.
razzledazzle
6

Solusi saya dengan footer tetap dan menu gulir (100% diuji)

 <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>
RD1819
sumber
6

Ini adalah bagaimana saya mencapai untuk menambahkan tata letak di bagian bawah navigasi:

Perpustakaan diperbarui

    <com.google.android.material.navigation.NavigationView
    android:id="@+id/navigation_drawer_container"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start">

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

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

                <com.google.android.material.navigation.NavigationView
                    android:id="@+id/nav_view"
                    android:layout_width="wrap_content"
                    android:layout_height="0dp"
                    android:layout_gravity="top"
                    android:layout_weight="0.8"
                    app:headerLayout="@layout/nav_header_home"
                    app:menu="@menu/activity_home_drawer" />

                <com.google.android.material.navigation.NavigationView
                    android:id="@+id/navigation_drawer_bottom"
                    android:layout_width="wrap_content"
                    android:layout_height="0dp"
                    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>
                </com.google.android.material.navigation.NavigationView>
        </LinearLayout>
    </androidx.core.widget.NestedScrollView>
</com.google.android.material.navigation.NavigationView>
zohaib khaliq
sumber
Ini adalah solusi yang tepat untuk menambahkan tata letak footer di bagian bawah Tampilan Navigasi. Meskipun satu tata letak linier tidak diperlukan yang telah saya edit dalam jawaban ini.
Akash Bisariya
Bagaimana Anda mengatur listener item navigasi terpilih dalam aktivitas ini? @zohaib khali
Akash Bisariya
5

NavigationViewanak pertama ListViewberisi item menu dan header.

Satu-satunya hal yang diperlukan untuk menambahkan footer adalah memanggil .addFooterView ke ListView

Info lebih lanjut: http://www.andreabaccega.com/blog/2015/08/28/how-to-add-footer-to-navigationview/

Salin kode tempel:

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);
  }
Andrea Baccega
sumber
10
di 'com.android.support:design:23.1.0' tidak berfungsi. ini telah menjadi RecyclerView di NavigationMenuPresenter
gordonpro
Saya menambahkan jawaban baru yang mungkin memecahkan masalah Anda.
Lukas
2

Letakkan saja tata letak lain di dalam NavigationView Anda:

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

Triknya adalah menggunakan layout_gravity = "bottom" - ini akan menempatkan seluruh tata letak Anda di bagian bawah dan menguji, test2 ditumpuk dengan benar.

McOzD
sumber
2

Gunakan ini..

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

lalu setel padding bawah ke 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());
        }
    });
OM PRAKASH SEERVI
sumber
2

Coba ini, ini pekerjaan untuk saya.

<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>
RdlP
sumber
1

Saya menggunakan formulir ini, bekerja untuk saya. dalam lanskap & potret.

<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>
Alex Zaraos
sumber
1

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


sumber
1
Tambahkan beberapa penjelasan dengan jawaban bagaimana jawaban ini membantu OP dalam memperbaiki masalah saat ini
ρяσѕρєя K
2
Saya punya solusinya. Anda harus menyertakan tata letak statis untuk footer, di dalam file <android.support.design.widget.NavigationView>...</android.support.design.widget.NavigationView>. untuk detail lebih lanjut, silakan periksa repositori github ( github.com/mehul0/AndroidSidemenuFooterExample-master )
1

Ini berfungsi agar saya meletakkan gambar di footer panel samping navigasi (orientasi potret dan lanskap)

    <?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 saya adalah

    <?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>
Sengson Haang Rai
sumber
1

Struktur tata letak untuk header dan footer lengket di menu laci:

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

Tata letak lengkap:

<?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>
pengusaha licik
sumber
1

Coba ini, ini pekerjaan untuk saya.https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

Namun, Anda menonaktifkan NavigationViewScrolling untuk pengguliran yang lebih lancar

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

Tangkapan layar:

JB Pha Le
sumber
0

Gulir footer untuk Versi> 23.xx

Saya akhirnya berhasil mencapai apa yang saya inginkan, sayangnya sepertinya tidak mungkin lagi untuk hanya mengambil referensi ke ListView dan menambahkan header dan footer seperti pada versi di bawah 23.xx (seperti dijelaskan oleh Andrea Baccega). Melakukan ini untuk tajuk masih memungkinkan:

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

Tetapi menambahkan footer tidak memungkinkan untuk saat ini. Namun, saya menemukan solusi jika Anda hanya mencoba menambahkan footer: Anda hanya membalik tampilan, ini akan menambahkan header ke bawah yang berperilaku seperti footer normal. Pastikan untuk membuat menu Anda dalam urutan terbalik

    // 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);
Lukas
sumber
0

Solusi pribadi saya untuk header dan footer tetap adalah memperluas NavigationView sebagai berikut:

/**
 * 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)
    }
}
}

Awalnya, NavigationView membuat LinearLayout sebagai item pertama di RecyclerView dan menggulir semua konten menjadi satu. Idenya adalah untuk membuat Views terpisah untuk footer dan header, lalu mendorongnya ke atas dan bawah menggunakan Gravity. Nanti saat mengukur konten untuk RecyclerView mengatur konten yang bergulir.

Berikut adalah pustaka yang berisi kode di atas yang saya tulis. https://github.com/guness/NavigationView

Sisi baiknya, sekarang saya dapat mendefinisikan tampilan footer di xml seperti header di native:

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

Berikut adalah solusi yang tidak memerlukan penumpukan dan yang secara dinamis menyesuaikan padding bawah dari NavigationMenuView internal berdasarkan tinggi tampilan footer itu sendiri, yang berarti tinggi footer dapat disetel ke wrap_contentdan Anda dapat secara dinamis mengubah visibilitas footer menjadi VISIBLEatau GONE.

public class NavigationMenuFooterView extends LinearLayout {

    public NavigationMenuFooterView(Context context) {
        super(context);
    }

    public NavigationMenuFooterView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NavigationMenuFooterView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
        update(getHeight());
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        update(h);
    }

    private void update(int height) {

        ViewParent parent = getParent();
        if (parent instanceof ViewGroup) {
            View navigationMenuView = ((ViewGroup) parent).findViewById(R.id.design_navigation_view);
            if (navigationMenuView != null) {
                if (getVisibility() == View.GONE) {
                    height = 0;
                }
                navigationMenuView.setPadding(navigationMenuView.getPaddingLeft(),
                        navigationMenuView.getPaddingTop(), navigationMenuView.getPaddingRight(), height);
            }
        }
    }
}

Anda perlu menentukan id design_navigation_view di ids.xml Anda:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item name="design_navigation_view" type="id"/>
    </resources>

Dan gunakan seperti ini:

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_header"
        app:itemBackground="@drawable/drawer_item"
        app:itemIconTint="@color/drawer_item"
        app:itemTextColor="@color/drawer_item"
        app:menu="@menu/menu_drawer">

        <util.NavigationMenuFooterView
            android:id="@+id/navigation_footer_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:background="#fff"
            android:orientation="vertical">

            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#ddd" />

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

        </util.NavigationMenuFooterView>

    </com.google.android.material.navigation.NavigationView>

Diuji dengan com.google.android.material:material:1.0.0.

Oliver Jonas
sumber
0

Jika Anda menggunakan listview, Anda dapat mencoba cara ini. Dukungan tampilan daftar menambahkan fungsi tampilan footer, sehingga Anda dapat menambahkan tampilan footer R.layout.drawer_footer kustom menggunakan objek listview seperti kode di bawah ini

View footerView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.drawer_footer, expandableListView, false);
TextView footer = footerView.findViewById(R.id.id_footer_wta_version_information);
expandableListView.addFooterView(footerView);

Dalam kasus saya, saya menggunakan expandableListView daripada listview (listview juga memiliki fungsi addFooter). Semoga cara ini membantu Anda

phancuongviet.dll
sumber
-1

Masukkan baris-baris ini ke dalam tata letak menu Anda. Saya harap ini akan memperbaiki masalah Anda:

    <group
        android:id="@+id/grp11"
        android:checkableBehavior="single">

        <item


            android:title="" />
        <item


            android:title="" />
        <item

            android:title="" />
        <item


            android:title="" />
        <item


            android:title="" />
        <item

            android:title="" />

    </group>
telanjang
sumber