NavigationView에 바닥 글을 추가하는 방법-Android 지원 디자인 라이브러리?


122

바닥 글 설정 및 프로필 항목을 어떻게 설정할 수 NavitationView있습니까? 이메일 탐색 창으로받은 편지함처럼 보입니다. NavitationView항목은 메뉴 리소스에 의해 팽창되는,하지만 난 메뉴 리소스에 아래 항목을 설정하는 방법 또는 내가에 사용자 정의보기를 설정할 수있는 방법을 모르는 NavigationView또는 하단 오프셋을? 나는 이것을 <LinearLayout...>바닥 글보기로 두려고 시도 했지만 작은 화면에서 바닥 글이 항목 위에 놓이고 메뉴를 스크롤 할 수 없으며 바닥 글 패딩을로 설정하려고 시도했지만 바닥 글도 패딩을 사용 NavigationView합니다.

이것은 작은 화면에서 스크롤되지 않습니다.

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

    <LinearLayout...>

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

스크롤하지 않음

이것은 스크롤되지만 바닥 글은 메뉴 항목 위에 있습니다.

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

여기에 이미지 설명 입력

서랍 메뉴 res/menu/drawer.xml파일 :

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

@ menu / drawer 파일을 어느 위치에 넣었
습니까

그것은/res/menu/drawer.xml
epool

메뉴 항목으로 "피드백"및 "로그 아웃"을 할 수없는 이유가 있습니까? 그 이유가 "로그 아웃"메뉴 아이콘을 동적으로 변경하려는 경우를 사용하여 수행 할 수 있어야합니다 menuItem.setIcon(Drawable).
hungryghost

이는 단지 요구 사항을위한 것이며 개인적으로 Google이받은 편지함 앱에서이 작업을 수행하는 방법을 알고 싶습니다.
epool

이 질문은 23.1 업데이트에서 더욱 중요해
졌습니다

답변:


151

내비게이션 메뉴에 고정 된 (비 스크롤링) 바닥 글을 원하는 경우 게시 한 것처럼 다른 레이아웃 주위에 NavigationView를 래핑해야합니다. NavigationView는 FrameLayout처럼 작동하므로 결국 NavigationView 메뉴 항목 위에 내부 레이아웃이 "스택"됩니다. 바닥 글 항목에 LinearLayout을 사용하여 정렬하는 한 가지 방법은 다음과 같습니다.

고정 바닥 글

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

이 예제에서는 TextViews를 사용했지만 바닥 글보기에 원하는대로 사용할 수 있습니다. 바닥 글 항목이 메뉴 하단과 겹치지 않도록하려면 메뉴 리소스 파일 끝에 더미 항목을 추가합니다 ( "spacers"처럼 작동 함).

res / menu / drawer.xml

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

마지막으로 실제 바닥 글보기를 위해 활동에 클릭 리스너를 추가하는 것을 잊지 마십시오.

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

바닥 글 스크롤

바닥 글이 NavigationView의 나머지 부분과 함께 스크롤되도록 허용하면 작업이 더 간단 해집니다 (추가 레이아웃 또는 클릭 리스너 없음). 메뉴 리소스 파일에 고유 항목으로 바닥 글 항목을 추가하기 만하면 <group>(이렇게하면 구분선이 생성됨 ) 모든 항목이 자동으로 처리되고 함께 스크롤됩니다.

res / menu / drawer.xml

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

1
이는 단지 요구 사항을위한 것이며 개인적으로 Google이받은 편지함 앱에서이 작업을 수행하는 방법을 알고 싶습니다.
epool

Google이 Gmail 앱에서 어떻게 작동하는지 잘 모르겠지만 외관상으로는 대답에서 설명한 것과 같습니다. <group> 구분선을 원하면 별도를 사용하십시오. 그렇지 않으면 Gmail 앱의 탐색 바닥 글이 일반 메뉴 항목처럼 보입니다 (적어도 나에게는).
hungryghost

1
아, 이제 이해합니다. Gmail 앱에 대해 말씀하시는 줄 알았어요. 받은 편지함 앱을 설치하지 않았지만 정적 바닥 글을 찾고 있다면 맞습니다. 별도의 레이아웃을 사용해야합니다. 그래도 너무 어렵지는 않습니다. 하자 알 ...
hungryghost

7
메뉴에서 더미 항목을 사용 <dimen name="design_navigation_padding_bottom" tools:override="true">48dp</dimen> 하는 dimen.xml대신 사용할 수 있습니다 ! 그것은 완벽 !
Omid

1
바닥 글 텍스트보기에 대한 서랍 항목의 글꼴 및 글꼴 크기를 어떻게 설정합니까?
JEGADEESAN S

37

해결 방법에 대한 힌트를 제공하지만 NavigationView에서 테스트 할 기회가 없으며 제대로 작동 할 것이라고 확신합니다.

여기 샘플 레이아웃 xml;

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

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

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

</FrameLayout>

결과는 다음과 같습니다.

여기에 이미지 설명 입력

트릭은 부모에 패딩을 적용하고 자식에 여백을 빼는 것입니다.


빠른 시도 :

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

여기에 이미지 설명 입력


3
이것은 효과가있을 수 있지만 마이너스 마진은 꽤 엉망입니다. 그래서 개인적으로 가능한 한 피합니다.
hungryghost 2015-06-08

이 바닥 글, "botom"중앙에 아이콘을 배치하면 화면에 따라 변경할 수 있으며 잘릴 것입니다.이 게시물을 참조하십시오. stackoverflow.com/questions/32460312/…
delive

전체 예제에 대한 링크를 제공 할 수 있습니까?
대인 수수

스크롤 가능으로 설정할 수 있습니까?
Ahmad Shahwaiz 2011

27

내비게이션 뷰 중첩의 다른 답변에 설명 된 접근 방식에 따라 몇 가지 문제가 발생했습니다.

  • 항목이 많거나 가로 모드에서 바닥 글이 메뉴 항목과 겹침
  • 실제 메뉴에 항목이 많으면 중첩 된 NavigationView가 스크롤 가능 해져서보기 좋지 않았습니다.
  • 중첩에 두 개의 NavigationView가 있으므로 사용자 지정보기를 바닥 글로 정의 할 수 없습니다.
  • 중첩 된 스크롤 뷰의 처리는 엉망이었습니다 (때로는 두 개의 스크롤바가 나타났습니다 등).
  • 고정 바닥 글은 항상 맨 아래에 있어야합니다 (메뉴 항목이 많거나 적음).

이 모든 문제에 대한 나의 해결책은 다음과 같습니다.

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

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

    <android.support.design.widget.NavigationView ...>

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

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

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

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

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

여기에서 NestedScrollView는 하위 NavigationView의 스크롤 부모 역할을합니다. 즉, sub-NavigationView는 스크롤바 자체를 표시하지 않지만 전체 콘텐츠는 평면 방식으로 표시됩니다.

'spacer_to_bottom'레이아웃은 나머지 공간을 모두 채우므로 메뉴 아이콘이 거의 없어도 바닥 글이 여전히 맨 아래에 있습니다.

마지막으로 고정 바닥 글은 실제 메뉴 (sub-NavigationView), 스페이서로 시작하는 선형 레이아웃에 추가되며 바닥 글 하단에 있습니다.

여기에서 AndroidStudio-Project로 작동하는 전체 예제를 찾을 수 있습니다. https://github.com/MarcDahlem/AndroidSidemenuFooterExample

특히 탐색 창은 여기에서 찾을 수 있습니다 : https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

스크린 샷 :

몇 가지 항목 많은 항목


정확히 작동하지 않는 것은 무엇입니까? 필요한 경우 스크롤 바닥 글과 잘 작동하는 예제 프로젝트를 제공 할 수 있습니다. @AndreaBaccega
Adreamus

작동하지 않고 @AndreaBaccega에 동의합니다. 탐색 메뉴 만 표시하고 바닥 글은 표시하지 않습니다
RdlP

좋아, 문제가있는 두 번째. 예제 프로젝트를 만들어 github에 업로드하겠습니다. CU 곧
Adreamus

: 나는 GitHub의에서 예제 프로젝트를 추가 github.com/MarcDahlem/AndroidSidemenuFooterExample
Adreamus

고도 속성에 대한 큰 찬성. 나는 같은 접근 방식으로 진행했지만 하단 그림자를 제거 할 수 없었습니다. 그런 다음 이것을 찾았습니다. 감사합니다!
Elvedin Selimoski

23

가장 간단한 대답은 서랍 레이아웃 내부에 버튼을 추가하고 중력을 하단으로 설정하는 것입니다. navigationview.xml .

다음은 코드입니다.

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

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

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

결과는 다음과 같습니다.


2
일부 메뉴 항목의 경우 작동 할 수 있습니다. 그러나 메뉴 항목이 많으면 버튼이 소형 장치 또는 가로 모드의 메뉴 항목과 겹칩니다.
Adreamus

1
그러나 이것을 극복하기 위해 빈 메뉴 항목을 넣을 수 있습니다.
Mohammed Fadhl

다른 화면 크기에 대해 빈 메뉴 항목으로 하단을 정렬하는 것이 거의 가능합니다. 하지만 내 솔루션에 설명 된대로이를 수행하는 일반적인 방법이 있습니다 ;-)-> 내 솔루션 참조 stackoverflow.com/a/37714353/1075072
Adreamus

17

컨테이너 탐색보기 레이아웃이 있어야하며 여기에 두 개의 탐색 레이아웃이 더 있어야합니다. 부모 레이아웃의 상단과 하단에 정렬합니다.

기본적으로 ScrimFrameLayout이고 상태 표시 줄과 더 잘 상호 작용하므로 FrameLayout이 아닌 탐색보기를 부모로 사용하는 것이 좋습니다.

다음은 활동의 예입니다.

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_dashboard"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">

<!-- Activity content goes here -->

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

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

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

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

이에 대해 자세히 알아보고 여기에서 예제를 볼 수 있습니다. http://blog.nitish.io/post/122633295558/android-design-library-navigationview-with-top


1
정말 좋은 솔루션입니다. 그러나 래핑 콘텐츠는 상단 및 하단 NavigationView 모두에서 작동하지 않습니다. 하단 NavigationView 블록 상단 NavigationView를 방지하기 위해 일정한 높이를 제공해야합니다.
Olcay Ertaş 2015

완벽한 솔루션
Bolein95

@Nitish "@ + id / navigation_drawer"가 세로 모드에서 더 많은 값을 가질 때 중복을 방지하는 방법. 하단 탐색보기 뒤로 이동했습니다. 제 경우에는 상단 navview 메뉴 항목이 동적으로 채워지고 하단 navview에는 정적 메뉴 값이 있습니다.
MohanRaj S

14

늦은 답변을 알고 있지만 대부분의 개발자가 찾고있는 완벽하고 정확한 답변입니다.

내비게이션보기에 바닥 글을 추가하려면 아래와 같이 내비게이션 메뉴에 사용자 정의보기를 추가합니다.

footer_navigation_menu.xml

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

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

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

</RelativeLayout>

이제 위의 뷰를 그룹 속성으로 메뉴 xml에 추가하여 메뉴에서 푸터로 구분할 수 있습니다.

profile_menu.xml

<group android:checkableBehavior="single">

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

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

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

그게 다야. 다음은 출력입니다.

여기에 이미지 설명 입력


하단 뷰에 고정 높이를 부여하기 때문에 복잡한 하단 뷰의 경우 동작하지 않습니다.
Akash Bisariya

작동 할 수도 있지만 onClickListeners를 바닥 글 레이아웃 내부의 뷰로 설정할 수있는 방법이 없습니다 ... 제 경우에는 바닥 글에 소셜 미디어 버튼이 외부 URL로 전송되지만 어떤 식 으로든 해당 ID를 사용하여 뷰를 가져올 수 없습니다. 나는 생각할 수 있었다 ...
Ramiro GM

12

NavigationView에 바닥 글을 추가 할 수있는 규정이 없다는 것은 일종의 당황스러운 일입니다. 하지만 이런 식으로 시도해 볼 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_base"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

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

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

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

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

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

바닥 글이 목록 인 경우

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

하지만 어떤 종류의 커스텀 뷰라면

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

또한이 경우에는 x = height of your custom footer view

도움이 되었기를 바랍니다.


감사합니다 형제. 당신은 내 일을했다 ... :)
SiddharthG

3
3 NavigationViews? 왜? 최악의 공연을 위해? 이 동영상의 일부를 봐주세요 : youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
루이 CAD

@LouisCAD 네거티브 마진없이 실제로 작동하는 솔루션이 있으면 공유해주세요. 여기에 언급 된 문제가 있으며 이것이 제가 고려하는 유일한 해결책입니다. 완벽한 솔루션이 아닐 수도 있고 성능에 약간의 영향을 미칠 수도 있지만 다른 구현 없이는 성능 문제에 대해서만 언급하지 마십시오. 우선, 앱 요구 사항이 중요합니다. Google이 앱 요구 사항에 대한 솔루션을 제공하지 않으면 옵션이 많지 않습니다.
Dascalescu Vladut

10

여기에 이미지 설명 입력나는 다음과 같은 방식으로 같은 것을 만들었다.

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

여기서 가장 중요한 것은 레이아웃 중력을 바닥에 놓는 것입니다.

LinearLayout android:layout_gravity="bottom"

이 솔루션을 사용하면 하단 뷰가 메뉴 항목 위에 떠있을 것입니다 (여러 메뉴 항목이있는 경우) ...하지만 하단에서 수정하고 싶습니다.
Akash Bisariya

7

접근 방식에 따라 몇 가지 사소한 변경 사항이 달성하려는 것을 도울 수 있습니다.

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

메뉴 항목이 겹치지 않도록 메뉴에서 일부 스텁 항목을 설정합니다.

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

또한 바닥 글 항목에 클릭 리스너를 추가 할 수 있습니다.


답변 해 주셔서 감사합니다. 이로 인해 바닥 글을 추가 할 수있는 해결 방법이 생겼습니다.하지만 더 나은 결과를 위해 더 나은 답변을 제공하는 사람이 없다면 답변을 수락하기를 바랍니다. +1
epool 2015-06-01

옵션을 실제로 열어 두십시오. 바닥 글도 중요하므로 더 나은 답변을 기대합니다.
razzledazzle 2015-06-02

6

고정 바닥 글 및 스크롤 메뉴가있는 내 솔루션 (100 % 테스트 됨)

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

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

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

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

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

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

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

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

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

    </RelativeLayout>

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

6

이것은 탐색 하단에 레이아웃을 추가하는 방법입니다.

업데이트 된 라이브러리

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

탐색보기 하단에 바닥 글 레이아웃을 추가하는 데 적합한 솔루션입니다. 이 답변에서 편집 한 선형 레이아웃이 필요하지 않았지만.
Akash Bisariya

이 활동에서 탐색 항목 선택 리스너를 어떻게 설정 했습니까? @zohaib khaliq
Akash Bisariya

5

NavigationView 첫 번째 아이는 ListView 헤더와 메뉴 항목을 모두 포함합니다.

바닥 글을 추가하는 데 필요한 유일한 것은 ListView에 .addFooterView를 호출하는 것입니다.

추가 정보 : http://www.andreabaccega.com/blog/2015/08/28/how-to-add-footer-to-navigationview/

붙여 넣기 코드 복사 :

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

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

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

    listView.addFooterView(toRet, null, false);
  }

10
'com.android.support:design:23.1.0'에서 작동하지 않습니다. 그것은 NavigationMenuPresenter에 RecyclerView이되었다
gordonpro

문제를 해결할 수있는 새로운 답변을 추가했습니다.
Lukas

2

NavigationView 안에 다른 레이아웃을 넣으십시오.

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

트릭은 layout_gravity = "bottom"을 사용하는 것입니다. 그러면 전체 레이아웃이 맨 아래에 배치되고 test2가 제대로 스택됩니다.


2

이것을 사용하십시오 ..

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

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

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

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

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

그런 다음 하단 패딩을 NavigationMenuView로 설정하십시오.

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

2

이것을 시도해보십시오.

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

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

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

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

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

                           <!--INCLUDE YOUR FOOTER HERE -->

                        </LinearLayout>
                    </LinearLayout>

                    </ScrollView>



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

1

나는이 양식을 사용하고 나를 위해 일합니다. 가로 및 세로.

<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
현재 문제를 해결에 어떻게 대답 도움이 영업 이익에 대한 답을 몇 가지 설명을 추가
K ρяσѕρєя

2
솔루션이 있습니다 <android.support.design.widget.NavigationView>...</android.support.design.widget.NavigationView>. 바닥 글에 대한 정적 레이아웃을 . 자세한 내용은 github repocitory ( github.com/mehul0/AndroidSidemenuFooterExample-master ) 를 확인하세요.

1

이것은 내비게이션 서랍 (세로 및 가로 방향)의 바닥 글에 이미지를 넣는 데 효과적입니다.

    <?xml version="1.0" encoding="utf-8"?>
        <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/drawer_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            tools:openDrawer="start">

            <include
                layout="@layout/app_bar_main3"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

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

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

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

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

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


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

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

내 nav_footer_main3은

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

1

서랍 메뉴에서 고정 머리글 및 바닥 글의 레이아웃 구조 :

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

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

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

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

전체 레이아웃 :

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

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

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

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

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

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

1

이것을 시도해보십시오. https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

그러나 부드러운 스크롤을 위해 NavigationViewScrolling을 비활성화해야합니다.

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

스크린 샷 :


0

버전> 23.xx에 대한 스크롤 바닥 글

마침내 내가 원하는 것을 얻을 수 있었지만, 불행히도 더 이상 ListView에 대한 참조를 잡고 23.xx 이하 버전 에서처럼 머리글과 바닥 글을 추가하는 것이 더 이상 불가능 해 보입니다 (Andrea Baccega에 의해 설명 됨). 헤더에 대해 이렇게하는 것은 여전히 ​​가능합니다.

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

그러나 현재는 바닥 글을 추가 할 수 없습니다. 그러나 바닥 글을 추가하려는 경우 해결 방법을 찾았습니다.보기를 반전하면 일반 바닥 글처럼 동작하는 맨 아래에 머리글이 추가됩니다. 메뉴를 역순으로 만들어야합니다.

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

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

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

0

고정 머리글 및 바닥 글에 대한 내 개인 솔루션은 NavigationView를 다음과 같이 확장하는 것입니다.

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

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

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

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

    a.recycle()

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

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

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

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

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

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

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

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

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

fun getHeaderView(): View? {
    return mHeader
}

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

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

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

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

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

fun getFooterView(): View? {
    return mFooter
}

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

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

원래 NavigationView는 RecyclerView의 첫 번째 항목으로 LinearLayout을 만들고 모든 콘텐츠를 함께 스크롤합니다. 이에 대한 아이디어는 바닥 글과 머리글에 대해 별도의 뷰를 만든 다음 Gravity를 사용하여 상단과 하단으로 푸시하는 것입니다. 나중에 RecyclerView의 콘텐츠를 측정하면 스크롤 콘텐츠가 정해집니다.

내가 작성한 위의 코드를 포함하는 라이브러리는 다음과 같습니다. https://github.com/guness/NavigationView

이것의 좋은 점은, 이제 네이티브의 헤더처럼 xml에서 푸터 뷰를 정의 할 수 있습니다.

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

0

다음은 중첩이 필요하지 않고 바닥 글보기의 자체 높이를 기반으로 내부 NavigationMenuView의 하단 패딩 을 동적으로 조정 하는 솔루션입니다. 즉, 바닥 글 높이를로 설정 wrap_content하고 바닥 글의 가시성을 VISIBLE또는로 동적으로 변경할 수 있습니다 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);
            }
        }
    }
}

ids.xml에서 design_navigation_view의 ID를 정의해야합니다.

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

다음과 같이 사용하십시오.

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

테스트 com.google.android.material:material:1.0.0.


0

listview를 사용하는 경우이 방법을 시도 할 수 있습니다. 목록보기는 바닥 글보기 추가 기능을 지원하므로 아래 코드와 같이 목록보기 개체를 사용하여 사용자 지정 바닥 글 R.layout.drawer_footer보기를 추가 할 수 있습니다.

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

제 경우에는 listview 대신 expandableListView를 사용합니다 (listview에는 addFooter 함수도 있음). 이 방법이 도움이되기를 바랍니다.


-1

이 줄을 메뉴 레이아웃에 넣으십시오. 문제가 해결되기를 바랍니다.

    <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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.