在Android中,如果NestedScrollView内容不足以滚动,如何让CollapsingToolbar停止折叠?此功能目前存在于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>
答案 0 :(得分:15)
添加
android:layout_gravity="fill_vertical"
答案 1 :(得分:3)
今天我做了一个自定义行为就是这样做。
它扩展了AppBarLayout.ScrollingViewBehavior,因此必须在滚动视图(NestedScrollView或其他)上设置。
您可以找到它on Github,如果有效,请告诉我。
关键部分是以编程方式根据内容高度设置AppBarLayout折叠高度,以便在结束时滚动停止。
答案 2 :(得分:2)
将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
内容将根据您的需要生效。
答案 3 :(得分:1)
可能不合适的快速解决方案是,在活动创建中,测量屏幕高度并将您的nestedScrollView子项指定为minimunHeight。这不会阻止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);
另一个解决方案(不是快速解决方案)是扩展NestedScrollView并覆盖dispatchNestedPreScroll()。这个方法用来告诉协调员布局 你有滚动一定数量的像素。我们的想法是计算你是否已经滚动了所有像素,然后调用super.dispatchNestedScrollView()。
要计算您是否已经显示了所有需要屏幕尺寸的内容,请仔细检查您的孩子以测量内容,以及您已经滚动了多少内容。
随着投掷,事情变得复杂一些。答案 4 :(得分:1)
添加以下行
android:layout_gravity="fill_vertical"
到您的嵌套ScrollView
答案 5 :(得分:1)
我建议使用natario's solution以及下面的代码来避免在滚动时修改appBarLayout。
app:scrimVisibleHeightTrigger="?attr/actionBarSize"