停止CollapsingToolbar在NestedScrollView用完滚动内容后折叠

在Android中,如果NestedScrollView的内容不足以滚动,如何让CollapsingToolbar停止折叠? 此function目前存在于Android 5.1.1的通讯录应用程序中。 不过,在我的代码中,当NestedScrollView停止滚动时,工具栏继续崩溃,两者之间留下空隙。

<?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" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main_content" 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="256dp" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <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" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="@dimen/content_padding_normal" app:expandedTitleMarginEnd="64dp"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:titleTextAppearance="@style/ActionBar.TitleText" app:layout_collapseMode="pin" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:scrollbars="none"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingBottom="@dimen/keyline_2"> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/element_spacing_normal"> <include layout="@layout/ViewLoadingIndeterminate" /> <LinearLayout android:id="@+id/progress_status_container" style="@style/ConnectionFieldContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="vertical" android:visibility="visible"> <Spinner android:id="@+id/progress_status" android:layout_width="match_parent" style="@style/Text.ConnectionField" /> <TextView style="@style/Text.ConnectionLabel" android:text="@string/mobile.customer.connect.progress.status" /> </LinearLayout> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/element_spacing_normal"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:id="@+id/email1_container" style="@style/ConnectionFieldContainer" android:orientation="horizontal" tools:visibility="visible"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/email1" style="@style/Text.ConnectionField" tools:text="bgnosis@gmail.com" /> <TextView style="@style/Text.ConnectionLabel" android:text="@string/mobile.customer.connect.email1" /> </LinearLayout> <ImageButton android:id="@+id/action_email1" style="@style/Button.ConnectionAction" android:src="@drawable/ic_email_black_24dp" /> </LinearLayout> <LinearLayout android:id="@+id/email2_container" style="@style/ConnectionFieldContainer" android:orientation="horizontal" tools:visibility="visible"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/email2" style="@style/Text.ConnectionField" tools:text="alternate@email.com" /> <TextView style="@style/Text.ConnectionLabel" android:text="@string/mobile.customer.connect.email2" /> </LinearLayout> <ImageButton android:id="@+id/action_email2" style="@style/Button.ConnectionAction" android:src="@drawable/ic_email_black_24dp" /> </LinearLayout> <LinearLayout android:id="@+id/phone_day_container" style="@style/ConnectionFieldContainer" android:orientation="horizontal" tools:visibility="visible"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/phone_day" style="@style/Text.ConnectionField" tools:text="801-555-1234" /> <TextView style="@style/Text.ConnectionLabel" android:text="@string/mobile.customer.connect.phone.day" /> </LinearLayout> <ImageButton android:id="@+id/action_call_phone_day" style="@style/Button.ConnectionAction" android:src="@drawable/ic_call_black_24dp" /> <ImageButton android:id="@+id/action_text_phone_day" style="@style/Button.ConnectionAction" android:src="@drawable/ic_textsms_black_24dp" /> </LinearLayout> </LinearLayout> </android.support.v4.widget.NestedScrollView> <android.support.design.widget.FloatingActionButton android:id="@+id/create_reminder" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_anchor="@id/collapsing_toolbar" app:layout_anchorGravity="bottom|right|end" app:borderWidth="0dp" app:elevation="@dimen/shadow_size" android:layout_marginBottom="@dimen/keyline_1" android:layout_marginRight="@dimen/keyline_1" android:src="@drawable/ic_alarm_add_white_24dp" app:backgroundTint="?attr/colorAccent" /> </android.support.design.widget.CoordinatorLayout> 

例

Solutions Collecting From Web of "停止CollapsingToolbar在NestedScrollView用完滚动内容后折叠"

只需添加

 android:layout_gravity="fill_vertical" 

在你的NestedScrollView。 🙂

使您的NestedScrollView

  <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="fill_vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:scrollbars="none"> 

CollapsingToolbarLayout将崩溃, NestedScrollView内容将按需要工作。

今天,我做了一个自定义的行为,只是这样做。

它扩展了AppBarLayout.ScrollingViewBehavior,所以必须在你的滚动视图(NestedScrollView或其他)上设置。

你可以在Github上find它,让我知道它是否工作。

关键部分是以编程方式设置基于内容高度的AppBarLayout折叠高度,以便在结束时滚动停止。

在活动创build过程中,可能不适合的快速解决scheme是测量屏幕高度,并将其作为minimunHeight分配给nestedScrollView子项。 这不会阻止Appbar滚动,但您的内容将一直向上滚动。

  //Calculate screen height in pixels DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); mScreenHeight = displaymetrics.heightPixels; //Get Statusbar size int statusBatHeight = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { mStatusBarHeight = getResources().getDimensionPixelSize(resourceId); } mContainer = (FrameLayout) findViewById(R.id.fragment_container); mContainer.setMinimumHeight(mScreenHeight - mStatusBarHeight); 

另一个解决scheme(不是快速的)将扩展NestedScrollView并覆盖dispatchNestedPreScroll()。 这个方法用来告诉Coordinator Layout你已经滚动了一定数量的像素。 这个想法是计算,如果你已经滚动所有的像素,然后调用super.dispatchNestedScrollView()或不。

要计算是否已经显示了所有的内容,您将需要屏幕大小,迭代通过您的孩子来衡量的内容,你已经滚动了多less。

事情变得更加复杂一些。

添加下面的行

 android:layout_gravity="fill_vertical" 

到你的嵌套ScrollView

我build议使用natario的解决scheme以及下面的一段代码来避免在滚动时脚本化appBarLayout。

app:scrimVisibleHeightTrigger="?attr/actionBarSize"