CollapsingToolbarLayout не работает (сворачивается) при прокрутке

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

Использовали это руководство: http://android-developers.blogspot.in/2015_05_01_archive.html.

Примечание. FrameLayout содержит список

    <LinearLayout 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="wrap_content"
        android:orientation="vertical"
        android:scrollbars="vertical">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="192dp"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">

                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbara"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    android:background="?attr/colorPrimary"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
            </android.support.design.widget.CollapsingToolbarLayout>
        </android.support.design.widget.AppBarLayout>

        <FrameLayout
            android:id="@+id/frame"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

Код макета кадра:

<RelativeLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ranjithnair02.com.supporttest.BlankFragment">

    <ListView
        android:id="@+id/rcyv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="10dp"
        android:src="@android:drawable/ic_search_category_default"
        app:borderWidth="0dp"
        app:elevation="5dp"
        app:rippleColor="@color/wallet_highlighted_text_holo_light" />
</RelativeLayout>

введите здесь описание изображения


comment
Попробуйте заменить корень LinearLayout на android.support.design.widget.CoordinatorLayout.   -  person S.D.    schedule 31.05.2015


Ответы (6)


Вы должны использовать RecyclerView вместо ListView

Примечание: не забудьте обновить RecyclerView в файле Gradle.

  compile 'com.android.support:recyclerview-v7:22.2.0'
person Kishan Vaghela    schedule 01.06.2015
comment
Обратите внимание: вы можете обернуть любой контейнер внутри NestedScrollView из Support Design Library, и это тоже будет работать. Таким образом, вы можете обернуть ListView внутри NestedSrollView - person Christopher Rucinski; 25.06.2015
comment
Вы не должны помещать Listview внутрь любого ScrollView - person Kishan Vaghela; 28.06.2015
comment
Обертывание ListView внутри вложенного ScrollView не будет работать - person KudzieChase; 31.08.2015
comment
Если вы используете `myRecycleForPrescription.setNestedScrollingEnabled(false);` для просмотра корзины, тогда поведение приложения не будет работать - person Mahmudul; 15.03.2016

Вместо этого я сделал пример, используя RecyclerView. Исходный код можно найти здесь: https://github.com/jiahaoliuliu/MaterialDesignSample/tree/collapsingToolbars.

Есть несколько вещей, которые вы должны принять во внимание, и в сообщении не говорится.

  1. Используйте CoordinatorLayout в качестве основного макета

  2. Используйте тему без ActionBar и вместо этого установите панель инструментов как actionBar. Вы можете сделать это, создав специальную тему для активности, например:

    <!-- Indigo without actionbar when toolbar is used -->
    <style name="IndigoWithoutActionBar" parent="Indigo">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
    

    И в файле AndroidManifest.xml сделайте следующее:

    <activity
        android:name=".CollapsingToolbarActivity"
        android:label="@string/app_name"
        android:theme="@style/IndigoWithoutActionBar"
        >
    </activity>
    

    Как только это будет сделано, установите его на код Java:

    // Actionbar
    final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    

Вот функциональный XML-код, который я использую.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    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:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/detail_backdrop_height"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:fitsSystemWindows="true">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginStart="48dp"
            app:expandedTitleMarginEnd="64dp">

            <ImageView
                android:id="@+id/backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                android:fitsSystemWindows="true"
                app:layout_collapseMode="parallax" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:layout_collapseMode="pin" />

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/simpleRecyclerView"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        />

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

Если вам этого недостаточно, вы можете следовать коду Криса Бейнса здесь: https://github.com/chrisbanes/cheesesquare

person jiahao    schedule 06.06.2015
comment
Я могу заставить его работать с RecyclerView. Моя проблема в том, что я хочу использовать FrameLayout. - person Psypher; 07.06.2015
comment
@Psypher: Вы должны поместить FrameLayout в NestedScrollView - person Kevin Crain; 15.08.2016

В моем случае: я не задаю высоту своему Toolbar.

Это было wrap_content. Если это так, попробуйте исправить высоту Toolbar, используя: -

android:layout_height="?attr/actionBarSize"
person Santanu Sur    schedule 02.07.2019
comment
Спасибо, это сработало для меня! На самом деле, если на панели инструментов не задана конкретная высота, CollapsingToolbarLayout не имеет понятия о свернутой высоте. - person reavcn; 11.08.2020

Проблема в RelativeLayout. Попробуйте заменить FrameLayout на ListView, а затем на FloatingButton. Все завернуто в CoordinatorLayout, конечно.

person aows    schedule 31.05.2015

Вам нужно добавить две вещи в список, и он будет работать

android:nestedScrollingEnabled="true"

app:layout_behavior="@string/appbar_scrolling_view_behavior"

Мой рабочий XML-код

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@color/black"
    tools:context="com.example.pr20020897.samplapp.DisplayAllDataActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="200dp">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:collapsedTitleTextAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"
            app:expandedTitleTextAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"
            app:expandedTitleMarginStart="72dp"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/toolbar_image"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_collapseMode="parallax"
                android:scaleType="centerCrop"
                android:src="@drawable/db"
                android:contentDescription="image" />


            <android.support.v7.widget.Toolbar
                android:id="@+id/app_bar"
                android:layout_width="match_parent"
                android:layout_height="?actionBarSize"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                app:navigationIcon="@drawable/ic_arrow_back"
                app:contentInsetStart="72dp"
                app:layout_collapseMode="pin" />


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

    <ListView
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:id="@+id/listView"
        android:nestedScrollingEnabled="true"
        android:scrollbars="none"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#FF0000"
        android:background="@color/black"
        android:dividerHeight="1dp">
    </ListView>
</android.support.design.widget.CoordinatorLayout>

Надеюсь помочь кому-нибудь.

person Minion    schedule 10.09.2018

person    schedule
comment
Также вы должны обернуть все в CoordinateLayout - person user2410066; 01.06.2015