У меня есть 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
, где они правильно прокручиваются и сдвигают все вниз на высоту панели приложения?
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
Похожие вопросы
Новые вопросы
android
Android - это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфоны, планшеты, автомобили, телевизоры, одежда, стекло, IoT). Для тем, связанных с Android, используйте специальные теги Android, такие как android-intent, android-activity, android-адаптер и т. Д. Для вопросов, не связанных с разработкой или программированием, но связанных с платформой Android, используйте эту ссылку: https: // android.stackexchange.com .