NavigationView - Android destek tasarım kitaplığına altbilgi nasıl eklenir?


122

Altbilgi ayarlarını ve profil öğelerini nasıl ayarlayabilirim NavitationView? Gelen Kutusu e-posta gezinme çekmecesine benziyor. NavitationViewÜrün menüsü kaynak tarafından şişirilmiş, ama menü kaynağına alt öğeleri ayarlamak için, veya nasıl bir özel bir görünüm ayarlayabilirsiniz nasıl bilmiyorum NavigationViewya da dibe ofset? Bunu <LinearLayout...>altbilgi görünümü olarak koymayı denedim , ancak küçük ekranlarda altbilgi öğelerin üzerine koyuyor ve menüyü kaydıramıyorum NavigationView, altbilgi dolgusu ayarlamaya çalıştım , ancak altbilgi de dolguyu alıyor.

Bu, küçük ekranlarda kaydırma değildir:

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

KAYDIRILIYOR

Bu kaydırılır, ancak altbilgi menü öğelerinin üzerinde:

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

görüntü açıklamasını buraya girin

Çekmece menü res/menu/drawer.xmldosyası:

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

@
Menu

O ise/res/menu/drawer.xml
epool

Menü öğeleri olarak "Geri Bildirim" ve "Çıkış" yapamamanızın bir nedeni var mı? Sebep, "Oturumu Kapat" için menü simgesini dinamik olarak değiştirmek istiyorsanız, bunu ile yapabilmelisiniz menuItem.setIcon(Drawable).
hungryghost

Bu sadece gereksinimler için ve şahsen Google'ın bunu gelen kutusu uygulamasında nasıl yaptığını bilmek istiyorum.
epool

Bu soru 23.1 güncellemesiyle daha da önemli hale geliyor
Alex Sorokoletov

Yanıtlar:


151

Gezinme menünüzde sabit (kaydırılmayan) bir altbilgi istiyorsanız, NavigationView'ü yayınladığınız gibi başka bir düzenin etrafına sarmanız gerekir. NavigationView, FrameLayout gibi çalışır, bu nedenle bu, NavigationView menü öğelerinin üstündeki iç düzeni "yığınlayarak" sona erer. Altbilgi öğeleri için LinearLayout kullanarak bunu düzenlemenin bir yolu:

Sabit Altbilgi

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

Bu örnekte TextViews kullandım, ancak altbilgi görünümleri için istediğinizi kullanabilirsiniz. Altbilgi öğelerinin menünün alt kısmıyla çakışmasını önlemek için, menü kaynak dosyanızın sonuna bazı kukla öğeler ekleyin (bunlar "boşluk" gibi davranacaktır):

res / menü / 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>

Son olarak, gerçek altbilgi görünümleri için Etkinliğinize tıklama işleyicileri eklemeyi unutmayın:

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

Kaydırma Altbilgisi

Altbilginin NavigationView'in geri kalanıyla birlikte kaydırmasına izin verirseniz, işleri daha basit hale getirir (ek düzenler veya tıklama dinleyicileri yoktur). Altbilgi öğelerini menü kaynak dosyanıza benzersiz olarak eklemeniz yeterlidir <group>(bu bir ayırıcı çizgi oluşturacaktır ) ve her şey otomatik olarak işlenecek ve birlikte kaydırılacaktır:

res / menü / 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>

1
Bu sadece gereksinimler için ve şahsen Google'ın bunu gelen kutusu uygulamasında nasıl yaptığını bilmek istiyorum.
epool

Google'ın bunu Gmail uygulamasında nasıl yaptığından emin değilim, ancak görünüşe bakılırsa, cevapta anlattığım gibi görünüyor. <group> Ayırıcı bir satır istiyorsanız ayrı bir satır kullanın, aksi takdirde gmail uygulamasının gezinme altbilgisi normal menü öğeleri gibi görünür (en azından bana göre).
hungryghost

1
Ahh, şimdi anlıyorum. Gmail uygulaması hakkında konuştuğunu sanıyordum. Gelen kutusu uygulamasını yüklemedim, ancak statik bir altbilgi arıyorsanız, o zaman haklısınız, ayrı bir düzen kullanmanız gerekiyor. Yine de bu çok zor olmamalı. Bakalım ...
hungryghost

7
Eğer kullanabilir <dimen name="design_navigation_padding_bottom" tools:override="true">48dp</dimen> içinde dimen.xmlyerine menüdeki kukla öğeleri kullanarak! mükemmel !
Omid

1
Altbilgi metin görünümü için çekmece öğesinin yazı tipini ve yazı tipi boyutunu nasıl ayarlayabilirim?
JEGADEESAN S

37

Size nasıl çözüleceğine dair ipucu vereceğim, ancak bunu NavigationView'da test etme şansım yok ve çalışacağından oldukça eminim.

burada örnek düzen 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>

İşte sonuç:

görüntü açıklamasını buraya girin

işin püf noktası ebeveyne dolgu ve çocuğa eksi kenar boşluğu uygulamaktır.


Hızlı deneme:

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

görüntü açıklamasını buraya girin


3
Bu işe yarayabilir, ancak negatif marjlar oldukça keskindir. Bu yüzden kişisel olarak mümkünse onlardan kaçınıyorum.
hungryghost

Bu altbilgi, ortalanmış "botom" simgeleri koyarsanız ekrana bağlı olarak değişiklik yapabilirsiniz ve kesilirsiniz bu
yazıyı görün

Tam örnek hakkında herhangi bir bağlantı verebilir misiniz?
06

kaydırılabilir olarak ayarlayabilir miyiz?
Ahmad Shahwaiz

27

İç içe yerleştirme gezinme görünümlerinin diğer yanıtlarında açıklanan yaklaşımların ardından bazı sorunlar ortaya çıktı:

  • Birçok öğe ile veya yatay modda, altbilgi menü öğeleriyle çakışıyordu
  • Gerçek menüde çok sayıda öğe varsa, yuvalanmış NavigationView kaydırılabilir hale geldi, bu da hoş görünmüyordu
  • İç içe yerleştirmede iki Navigasyon Görünümü olması, özel görünümlerin altbilgi olarak tanımlanmasına izin vermedi.
  • İç içe kaydırma görüntülemelerin işlenmesi bir karmaşaydı (bazen iki kaydırma çubuğu göründü vb.)
  • Sabit Altbilgi her zaman altta olmalıdır (az sayıda ve birçok menü öğesinde)

Tüm bu sorunlar için benim çözümüm şuydu:

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

Burada NestedScrollView, alt NavigationView için kaydırma üst öğesi görevi görür. Bu, alt NavigationView'ın kaydırma çubuklarını hiçbir zaman göstermediği, ancak tüm içeriğin düz bir şekilde gösterildiği anlamına gelir.

'Spacer_to_bottom' düzeni, kalan tüm alanı doldurur, böylece birkaç menü simgesiyle altbilgi hala altta kalır.

Son olarak, sabit altbilgi, gerçek menü (alt-NavigationView), boşluk bırakıcı ile başlayan ve alt kısmında altbilgi bulunan doğrusal düzene eklenir.

Burada eksiksiz çalışma örneğini AndroidStudio-Project olarak bulabilirsiniz: https://github.com/MarcDahlem/AndroidSidemenuFooterExample

Özellikle gezinme çekmecesi burada bulunabilir: https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

Ekran görüntüleri:

Birkaç öğe Birçok öğe


Tam olarak ne çalışmıyor? Gerekirse kayan altbilgi ile harika çalışan örnek bir proje sağlayabilirim. @AndreaBaccega
Adreamus

@AndreaBaccega'ya katılıyorum, çalışmıyor, yalnızca gezinme menüsünü göster ve altbilgiyi göstermiyor
RdlP

tamam, ikinci sorunlu. Örnek bir proje oluşturup github'a yükleyeceğim. cu soon
Adreamus


Yükseklik özelliği için büyük olumlu oy. Ben de aynı yaklaşımla gidiyordum ama alt gölgeden kurtulamadım. Sonra bunu buldum. Teşekkür ederim!
Elvedin Selimoski

23

En basit cevap, Çekmece düzeninin içine bir düğme eklemek ve navigationview.xml.

İşte kod:

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

işte sonuç


2
Birkaç menü öğesi için bu işe yarayabilir. Ancak birçok menü öğeniz olur olmaz, düğme küçük cihazlarda veya yatay modda menü öğeleriyle çakışacaktır.
Adreamus

1
ancak bunun üstesinden gelmek için boş menü öğeleri koyabilirsiniz.
Muhammed Fadhl

farklı ekran boyutları için boş menü öğeleriyle altını hizalamak neredeyse mümkündür. Ancak
çözümümde

17

Bir kapsayıcı gezinme görünümü düzenine sahip olmanız ve ardından iki gezinme düzeni daha içermeniz gerekir. Bunları ana mizanpajın üstüne ve altına hizalarsınız.

Temelde bir ScrimFrameLayout olduğundan ve durum çubuğuyla daha iyi etkileşim kurduğundan, bir FrameLayout değil üst öğe olarak bir gezinme görünümü kullanmanızı tavsiye ederim.

İşte etkinliğinizin nasıl görünmesi gerektiğine dair bir örnek:

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

Bununla ilgili daha fazla bilgi edinebilir ve burada bir örnek görebilirsiniz: http://blog.nitish.io/post/122633295558/android-design-library-navigationview-with-top


1
Gerçekten güzel bir çözüm. Ancak içeriği kaydır, hem üst hem de alt NavigationView'da çalışmaz. Alt NavigationView bloğunun üst NavigationView'i önlemek için sabit bir yükseklik vermelisiniz.
Olcay Ertaş

perfect solution
Bolein95

"@ + İd / navigation_drawer" dikey modda daha fazla değere sahip olduğunda @Nitish nasıl örtüşmeden kaçınır. alt gezinme görünümünün arkasına gitti. Benim durumumda, üst navview menü öğeleri dinamik olarak doldurulur, alt navview statik menü değerlerine sahiptir.
MohanRaj S

14

Geç cevabını biliyorum, ancak çoğu geliştiricinin aradığı mükemmel ve doğru cevabı.

Gezinme görünümüne altbilgi eklemek için, aşağıdaki gibi gezinme menüsüne özel görünüm ekleyin:

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>

Şimdi, yukarıdaki görünümü menünüze grup özelliği ile xml ekleyin, böylece menüde altbilgi olarak farklılaşabilir.

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>

Bu kadar. Aşağıda çıktı:

görüntü açıklamasını buraya girin


Alttan görünüme sabit yükseklik verdiği için karmaşık alttan görünüm durumunda çalışmaz.
Akash Bisariya

İşe yarayabilir, ancak onClickListeners'ı altbilgi düzeninin içindeki görünümlere ayarlamanın bir yolu yok ... Benim durumumda, altbilgide harici URL'lere gönderen sosyal medya düğmeleri var, ancak kimliklerini kullanarak görünümleri hiçbir şekilde elde edemedim. Aklıma gelen ...
Ramiro GM

12

NavigationView'ün altbilgi eklemek için bir hükmüne sahip olmaması bir tür serseri. Ama bunun gibi bir şey deneyebilirsin

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

Altbilginiz bir liste ise,

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

Ancak, bir tür özel görünümse,

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

Ayrıca, bu durumda, ayarlamanız gerekecek x = height of your custom footer view

Umarım yardımcı olur.


Sağ ol, kanka. günümü yaptın .. :)
SiddharthG

3
3 Navigasyon Görünümleri? Neden? En kötü performanslar için mi? Lütfen bu videolardan bazılarını izleyin: youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
Louis CAD,

@LouisCAD Negatif marj olmadan gerçekten çalışan bir çözümünüz varsa, lütfen bizimle paylaşın. Burada bahsedilen sorun bende var ve dikkate aldığım tek çözüm bu. Belki mükemmel bir çözüm değildir ve performans üzerinde bazı etkilere sahip olabilir ... ancak başka uygulamalar olmadan, yalnızca performans konuları hakkında yorum yapmayın. Her şeyden önce, uygulama gereksinimleri önemlidir. Google, uygulama gereksinimlerinize çözüm sağlamazsa ... çok fazla seçeneğiniz yoktur.
Dascalescu Vladut

10

görüntü açıklamasını buraya girinAynı şeyi şu şekilde yaptım:

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

Burada asıl önemli olan, yerleşim yer çekimini en alta koymamdır.

LinearLayout android:layout_gravity="bottom"

Bu çözümle, alttan görünüm menü öğelerinin üzerinde yüzecek (birden fazla menü öğesi varsa) ... Ama altta sabitlenmesini istiyorum.
Akash Bisariya

7

Yaklaşımınızı takiben, bazı küçük değişiklikler elde etmek istediğiniz şeye yardımcı olabilir.

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

Ve menüdeki bazı saplama öğelerini ayarlayın, böylece menü öğeleri çakışmaz.

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

Ayrıca, altbilgi öğenize bir tıklama dinleyicisi eklemek istersiniz.


Cevabınız için teşekkürler, bu bana altbilgimi eklemem için bir geçici çözüm sağladı, ancak umarım kimse daha iyi yapmam için bana daha iyi bir cevap vermezse cevabınızı kabul ederim. +1
epool

Seçeneklerinizi gerçekten açık tutun. Altbilgiler önemli olduğundan daha iyi yanıtları da bekliyorum.
razzledazzle

6

Sabit altbilgi ve kaydırma menülerine sahip çözümüm (% 100 test edildi)

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

6

Gezinmenin alt kısmına düzen eklemeyi bu şekilde başardım:

Güncellenen kitaplıklar

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

Bu, Navigasyon Görünümü'nün altına altbilgi düzeni eklemek için doğru çözümdür. Bu cevapta düzenlediğim bir doğrusal düzene ihtiyaç olmamasına rağmen.
Akash Bisariya

Bu aktivitede gezinti öğesi seçili dinleyiciyi nasıl ayarladınız? @zohaib khaliq
Akash Bisariya

5

NavigationViewilk çocuk, ListViewhem başlık hem de menü öğelerini içerir.

Altbilgi eklemek için gereken tek şey ListView'a .addFooterView çağrısıdır.

Daha fazla bilgi: http://www.andreabaccega.com/blog/2015/08/28/how-to-add-footer-to-navigationview/

Yapıştırma kodunu kopyalayın:

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

10
"com.android.support:design:23.1.0" üzerinde çalışmıyor. NavigationMenuPresenter'da RecyclerView oldu
gordonpro

Sorununuzu çözebilecek yeni bir cevap ekledim.
Lukas

2

Navigasyon Görünümünüzün içine başka bir düzen eklemeniz yeterli:

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

İşin püf noktası layout_gravity = "bottom" kullanmaktır - bu, tüm düzeninizi en alta yerleştirecek ve test2'nin düzgün bir şekilde istiflendiğini test edecektir.


2

bunu kullan..

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

ardından alt dolguyu NavigationMenuView olarak ayarlayın

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

Bunu dene, bu iş benim için.

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

1

Bu formu kullanıyorum, benim için çalış. yatay ve dikey olarak.

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

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>


1
Bu cevabın şu anki sorunu
çözmede OP'ye

2
Çözümü buldum. Altbilgi için statik bir düzen eklemelisiniz <android.support.design.widget.NavigationView>...</android.support.design.widget.NavigationView>. daha fazla ayrıntı için lütfen github repocitory adresini kontrol edin ( github.com/mehul0/AndroidSidemenuFooterExample-master )

1

Bu, görüntüleri gezinme çekmecesinin altbilgisine koymam için çalışıyor (dikey ve Yatay yönlendirme)

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

benim 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

Çekmece menüsünde yapışkan üstbilgi ve altbilgi için düzen yapısı:

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

Tam düzen:

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

Bunu dene, bu iş benim için. https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

Ancak, daha düzgün kaydırma için NavigationViewScrolling'i devre dışı bırakmanız

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

Ekran görüntüleri:


0

Sürüm> 23.xx için kaydırma altbilgisi

Sonunda istediğimi elde etmeyi başardım, maalesef ListView referansını alıp 23.xx altındaki sürümlerde olduğu gibi (Andrea Baccega tarafından açıklandığı gibi) bir üstbilgi ve altbilgi eklemek artık mümkün değil gibi görünüyor. Bunu başlık için yapmak hala mümkündür:

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

Ancak şu anda altbilgi eklemek mümkün değil. Ancak, sadece bir altbilgi eklemeye çalışıyorsanız bir çözüm buldum: Görünümü ters çevirirseniz, üstbilgiyi normal bir altbilgi gibi davranan alt kısma ekler. Menünüzü ters sırada oluşturduğunuzdan emin olun.

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

Sabit üstbilgi ve altbilgi için kişisel çözümüm, NavigationView'ü aşağıdaki gibi genişletiyor:

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

Başlangıçta NavigationView, RecyclerView'da ilk öğe olarak bir LinearLayout oluşturur ve tüm içeriği birlikte kaydırır. Bu konudaki fikir, altbilgi ve üstbilgi için ayrı Görünümler oluşturmak ve ardından bunları Gravity kullanarak yukarı ve aşağı itmektir. Daha sonra RecyclerView için içerik ölçümü üzerine kaydırma içeriği yerleşir.

İşte yazdığım yukarıdaki kodu içeren kütüphane. https://github.com/guness/NavigationView

Bunun iyi yanı, artık yereldeki başlık gibi xml'de altbilgi görünümünü tanımlayabiliyorum:

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

0

Burada yuvalama gerektirmeyen ve alt bilgi görünümünün kendi yüksekliğine göre dahili NavigationMenuView alt dolgusunu dinamik olarak ayarlayan bir çözüm var ; bu, altbilgi yüksekliğinin ayarlanabileceği wrap_contentve altbilginin görünürlüğünü VISIBLEveya olarak dinamik olarak değiştirebileceğiniz anlamına gelir 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);
            }
        }
    }
}

İds.xml dosyanızda design_navigation_view kimliğini tanımlamanız gerekir:

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

Ve bunun gibi kullanın:

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

İle test edildi com.google.android.material:material:1.0.0.


0

Listview kullanıyorsanız, bu şekilde deneyebilirsiniz. Liste görünümü, altbilgi görünümü işlevini ekler, böylece aşağıdaki kod gibi listview nesnesini kullanarak özel bir altbilgi R.layout.drawer_footer görünümü ekleyebilirsiniz.

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

Benim durumumda, listview yerine expandableListView kullanıyorum (listview ayrıca addFooter işlevine de sahiptir). Umarım bu yol sana yardımcı olur


-1

Bu satırları menü düzeninize yerleştirin. Umarım sorununuzu çözecektir:

    <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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.