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

바닥 글 설정 및 프로필 항목을 어떻게 설정할 수 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>


답변

내비게이션 메뉴에 고정 된 (비 스크롤링) 바닥 글을 원하는 경우 게시 한 것처럼 다른 레이아웃 주위에 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>

답변

해결 방법에 대한 힌트를 제공하지만 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>


답변

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

  • 항목이 많거나 가로 모드에서 바닥 글이 메뉴 항목과 겹침
  • 실제 메뉴에 항목이 많으면 중첩 된 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

스크린 샷 :


답변

가장 간단한 대답은 서랍 레이아웃 내부에 버튼을 추가하고 중력을 하단으로 설정하는 것입니다. 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>


답변

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

기본적으로 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


답변

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

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

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>

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


답변

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

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