У меня есть AppBarLayout в моем приложении вместе с FrameLayout, который я использую в качестве заполнителя для загрузки фрагментов:

 <android.support.design.widget.AppBarLayout
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>

        <FrameLayout android:id="@+id/main_content_fragment"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:background="@color/white" />
    </android.support.design.widget.AppBarLayout>

Рассматриваемый фрагмент выглядит так:

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <ProgressBar android:id="@+id/loading_downloaded"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    <android.support.v7.widget.RecyclerView
            android:id = "@+id/items_downloaded"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical"
            app:layout_constraintEnd_toEndOf="parent"
            />
</LinearLayout>

Фрагмент подставляется из кода, как вы могли ожидать:

  val fragMan: FragmentManager = getSupportFragmentManager()
   fragMan.beginTransaction().add(R.id.main_content_fragment, fragment).commit()     

Проблема в том, что я не могу прокрутить свой RecyclerView, когда форматирую его таким образом. Если я переместу FrameLayout за пределы AppBarLayout, он будет работать отлично, но тогда фрагмент находится за панелью приложения, что очень неопрятно. Это подтверждает для меня, что фрагмент работает правильно, я просто не могу понять, почему поведение прокрутки фрагмента изменяется, когда он находится внутри AppBarLayout.

Что мне нужно сделать, чтобы прокрутить мой контент? Или я неправильно понял, и мне нужно отобразить свои фрагменты за пределами AppBarLayout, где они правильно прокручиваются и сдвигают все вниз на высоту панели приложения?

0
glenatron 20 Дек 2019 в 21:35

1 ответ

Содержимое вашего фрагмента предназначено для размещения как AppBarLayout. Вы должны обернуть все внутри CoordinatorLayout и установить этот атрибут в своем FrameLayout месте вашего фрагмента: app:layout_behavior="@string/appbar_scrolling_view_behavior".

Вот ваша структура XML будет:

<CoordinatorLayout>
    <FrameLayout 
        app:layout_behavior="@string/appbar_scrolling_view_behavior" ... > 
        ... 
    </FrameLayout>
    <AppBarLayout> ... </AppBarLayout>
</CoordinatorLayout>

Наличие этой настройки позволит вашему фрагменту показать все свои виды с вашим AppBarLayout. CoordinatorLayout позаботится обо всем за вас.

Вот официальная документация:

AppBarLayout также требует отдельной прокрутки, чтобы знать, когда прокручивать. Привязка выполняется с помощью класса поведения AppBarLayout.ScrollingViewBehavior. Это означает, что вы должны установить поведение вашего прокручиваемого представления как экземпляр AppBarLayout.ScrollingViewBehavior. Доступен строковый ресурс, содержащий полное имя класса.

Смотрите эту ссылку для более подробной информации: https://developer.android.com/reference/android/support/design/widget/AppBarLayout.html

1
Christilyn 20 Дек 2019 в 19:52