Додайте перегляди внизу панелі інструментів в CoordinatorLayout


176

У мене такий макет:

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

Я додаю Fragments в FrameLayout, замінюючи їх. Один з моїх Fragments - це список, який має такий макет:

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

Моя проблема тут у тому, що панель інструментів намальована над списком . Я спробував це вирішити, перетягнувши вміст символу " CoordinatorLayouta" LinearLayout, що вирішило перевитрату, але таким чином поведінка прокрутки програми не працює більше.

Будь-яка допомога дуже цінується!

Відповіді:


355

Візьміть атрибут

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") і додавши нижній край, рівний висоті кнопки, до пода під панеллю інструментів.


1
Дуже дякую, це справді працює! Моя єдина проблема після цього, якщо панель інструментів була переміщена, вона не повернулася після заміни цього Fragmentсписку іншою Fragment. Мені вдалося вручну показати панель інструментів таким чином.
WonderCsabo

Ого. Я завжди думав, що власний макет Fragment повністю замінив FrameLayout "заповнювачем", але я бачу, що це зовсім не так. Дякую за цю відповідь! Це мені дуже допомогло.
Прагнення Дева

@Surendar D , будь ласка , перевірте, якщо ви можете stackoverflow.com/questions/42968587 / ...
Mohamed Рихана

Приємно. Дякую!
Разван

87

Мені вдалося виправити це, додавши:

android: layout_marginTop = "? android: attr / actionBarSize"

до FrameLayout так:

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

9
Замість додавання marginTop add app: layout_behavior = "@ string / appbar_scrolling_view_behavior"
Naveed Ahmad

3
Ідеальне рішення, коли @ string / appbar_scrolling_view_behavior недоступний
Julius

Будь ласка, використовуйтеandroid:layout_marginTop="?android:attr/actionBarSize"
Martin Pfeffer

6
Це свого роду хакі, додавши запас того, який розмір МОЖЕ бути (якщо ви завжди будете мати панель інструментів такого розміру) в якийсь момент зірветься
Кенні

0

Що стосується Android Studio 3.4, вам потрібно помістити цю лінію у свій макет, у якому розміщено RecyclerView.

app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"

0

Щоб використовувати згортається верхній ToolBar або використовувати ScrollFlags за власним вибором, ми можемо зробити наступний спосіб: З Дизайну матеріалів позбутися FrameLayout

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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">

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleGravity="top"
            app:layout_scrollFlags="scroll|enterAlways">


        <androidx.appcompat.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin">

            <ImageView
                android:id="@+id/ic_back"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_arrow_back" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="back"
                android:textSize="16sp"
                android:textStyle="bold" />

        </androidx.appcompat.widget.Toolbar>


        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/post_details_recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="5dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.