Исправлен заголовок навигации в панели навигации при прокрутке элементов.

ТЕКУЩЕЕ СОСТОЯНИЕ: NavigationDrawer с элементами NavigationHeader и NavigationMenu. Количество элементов велико, поэтому для доступа к элементам в нижней части требуется прокрутка.

ТРЕБОВАНИЕ: при прокрутке вниз заголовок NavigationHeader должен оставаться фиксированным.

Вот мой файл макета activity_main

<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"
    android:fitsSystemWindows="true"
    android:background="#00000000"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer"
    />

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

Вот мой файл макета navigation_header_main

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="vertical"
android:background="#3d3b3b"

android:theme="@style/ThemeOverlay.AppCompat.Dark">

<android.support.v7.widget.AppCompatImageView
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:src="@drawable/categories"
    android:padding="1dp"
    />

</RelativeLayout>

P.S. Я новичок в Android-разработке. Пожалуйста, запросите дополнительные ресурсы, если это необходимо


person Parabola    schedule 09.05.2016    source источник
comment
NavigationView – это всего лишь RecyclerView, и вид сверху будет прокручиваться вместе с остальными. если вы этого не хотите, вам придется создать свой собственный макет для использования в качестве меню.   -  person David Medenjak    schedule 09.05.2016
comment
Спасибо за ответ. Итак, насколько я понимаю, мне нужно будет создать собственное представление навигации вместо виджета поддержки дизайна, да?   -  person Parabola    schedule 10.05.2016
comment
Не обязательно иметь пользовательский вид. Например. вы можете добавить LinearLayout с вашим заголовком и NavigationView ниже   -  person David Medenjak    schedule 10.05.2016
comment
Нашел обходной путь. Определенно не самый эффективный. Пожалуйста, предложите, можно ли что-нибудь сделать отсюда. ‹android.support.design.widget.NavigationView› android:id=@+id/nav_view android:layout_width=wrap_content android:layout_height=match_parent android:layout_gravity=start android:fitsSystemWindows=true android:background=#00000000 app:headerLayout= Приложение @layout/nav_header_main:menu=@menu/activity_main_drawer›‹/android.support.design.widget.NavigationView›   -  person Parabola    schedule 10.05.2016


Ответы (5)


Нашел обходной путь. Определенно не самый эффективный. Пожалуйста, предложите, можно ли что-нибудь сделать отсюда.

<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"
  android:fitsSystemWindows="true"
  android:background="#00000000"
  app:headerLayout="@layout/nav_header_main"
  app:menu="@menu/activity_main_drawer">

 <include layout="@layout/nav_header_main"

 <android.support.design.widget.NavigationView>

Definitely works. But the header layout is redundant

person Parabola    schedule 10.05.2016
comment
проверьте мой ответ на избыточную проблему макета заголовка - person Deven; 05.08.2017
comment
Да, макет заголовка перекрывает меню, поэтому часть меню скрыта ниже - person Abhinav Saxena; 16.06.2018

Я знаю, что это слишком старый вопрос, но я делюсь решением, которое работает для меня:

<сильный>1. ПОМЕСТИТЕ nav_header_main внутри NavigationView

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

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

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

<сильный>2. ДОБАВЬТЕ пустой элемент, подходящий для высоты вашего заголовка, в файл @menu/activity_main_drawer

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:enabled="false"
          android:title=" " />
    <item android:enabled="false"
          android:title=" " />
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/home"
            android:title="@string/home" />
        ......
    </group>
</menu>        
person Deven    schedule 05.08.2017
comment
Гениальный обходной путь. Меня устраивает. Спасибо Девен. - person iSofia; 22.09.2017

Привет, ребята, я придумал решение для nav_drawer и то, как мы можем реализовать статический nav_drawer без написания дополнительного кода.

Я делюсь ссылкой git на проект, над которым я сейчас работаю. Спасибо !! Ниже приведен файл activity_main.xml, и я использовал меню просмотра навигации.

    <?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_main_bg_shape"
        android:orientation="vertical">

        <Button
            android:id="@+id/whats_cool"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="260dp"
            android:layout_marginTop="400dp"
            android:background="@drawable/buttonshape"
            android:fontFamily="@font/delius_unicase"
            android:shadowColor="#362802"
            android:shadowDx="4"
            android:shadowDy="3"
            android:shadowRadius="10"
            android:text="What's Cool"
            android:textColor="#003931"
            android:textSize="12sp" />

    </LinearLayout>


    <android.support.design.widget.NavigationView
        app:headerLayout="@layout/nav_header"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="@color/gray_white"
        app:menu="@menu/nav_drawer"
        android:layout_gravity="start"
        app:itemTextColor="@color/darkBlue"
        app:itemIconTint="@color/darkBlue"
        >
    <include layout="@layout/nav_header"/>

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

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

И вам не нужно вносить какие-либо изменения в макет заголовка и nav_drawer.

person LoveAnimesh143    schedule 18.04.2018
comment
Это то же самое, что и ответ ниже от Parabola (вызывает избыточность), и на него ответил Девен чуть ниже вашего сообщения. - person Abhinav Saxena; 16.06.2018

Просто оберните представление навигации в линейный макет.

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

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

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

        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="#00000000"
            android:fitsSystemWindows="true"
            app:menu="@menu/activity_main_drawer"/>

    </LinearLayout>
person andre    schedule 29.03.2017

  1. Удалите ориентацию из RelativeLayout. это не поддерживает
  2. Установите android:gravity="bottom" для родительского RelativeLayout представления заголовка.

Моя ошибка, он все равно будет прокручиваться. Вам нужно иметь собственный вид переработчика для вашего меню навигации. Таким образом, он прокручивается в своем собственном контейнере

person daxgirl    schedule 09.05.2016