Добавить представления ниже панели инструментов в CoordinatorLayout

У меня есть следующий макет:

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/main_content"
    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.support.design.widget.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

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

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</android.support.design.widget.CoordinatorLayout>

Я добавляю Fragment в FrameLayout, заменяя их. Один из моих Fragment - это список, который имеет следующий макет:

<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

Моя проблема здесь в том, что панель нарисована над списком. Я попытался решить это, обернув содержимое CoordinatorLayout в LinearLayout, который решил переустановить, но таким образом поведение прокрутки в панели приложения больше не работает.

Любая помощь очень ценится!

Ответ 1

Возьмите атрибут

app:layout_behavior="@string/appbar_scrolling_view_behavior"

от RecyclerView и поместите его на FrameLayout, который вы пытаетесь показать под Toolbar.

Я обнаружил, что одна важная вещь, которую выполняет поведение прокрутки, заключается в компоновке компонента под панелью инструментов. Поскольку FrameLayout имеет потомок, который будет прокручиваться (RecyclerView), CoordinatorLayout получит эти прокручивающие события для перемещения Toolbar.


Еще одна вещь, о которой нужно знать: это поведение макета приведет к тому, что высота FrameLayout будет иметь размер, как если бы Toolbar уже прокручивается, а с Toolbar полностью отображается весь вид просто проталкивается вниз что нижняя часть представления находится ниже нижней части CoordinatorLayout.

Это было для меня неожиданностью. Я ожидал, что представление будет динамически изменяться, поскольку панель инструментов прокручивается вверх и вниз. Поэтому, если у вас есть прокручиваемый компонент с фиксированным компонентом в нижней части вашего представления, вы не увидите этот нижний компонент, пока не пролистнете полностью Toolbar.

Поэтому, когда я хотел привязать кнопку в нижней части пользовательского интерфейса, я работал вокруг этого, поместив кнопку внизу CoordinatorLayout (android:layout_gravity="bottom") и добавив нижнее поле, равное высоте кнопки, чтобы вид под панелью инструментов.

Ответ 2

Мне удалось исправить это, добавив:

Android: layout_marginTop = "андроид: атр /actionBarSize "

в FrameLayout, например:

 <FrameLayout
        android:id="@+id/content"
        android:layout_marginTop="?android:attr/actionBarSize"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       />

Ответ 3

Начиная с Android Studio 3.4, вам нужно поместить эту строку в свой макет, который содержит RecyclerView.

Приложение: layout_behavior = "android.support.design.widget.AppBarLayout $ ScrollingViewBehavior"