Androidで、NestedScrollViewがスクロールするコンテンツを使い果たした場合に、CollapsingToolbarの折りたたみを停止するにはどうすればよいですか?この機能は現在、Android 5.1.1の連絡先アプリに存在します。ただし、私のコードでは、NestedScrollViewがスクロールを停止すると、ツールバーが折りたたまれ続け、2つの間にギャップが残ります。
<?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="[email protected]" />
<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="[email protected]" />
<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>
追加するだけです
Android:layout_gravity="fill_vertical"
nestedScrollViewで。 :)
今日、私はこれを行うカスタムビヘイビアを作成しました。
AppBarLayout.ScrollingViewBehaviorを拡張するため、スクロールビュー(NestedScrollViewなど)で設定する必要があります。
あなたはそれを見つけることができます Github上 、それが機能するかどうか私に知らせてください。
重要な部分は、コンテンツの高さに基づいてAppBarLayoutの折りたたみ高さをプログラムで設定することです。これにより、終了するとスクロールが停止します。
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をスクリミングしないように、以下のコードとともに natarioのソリューション を使用することをお勧めします。
app:scrimVisibleHeightTrigger="?attr/actionBarSize"
以下の行を追加します
Android:layout_gravity="fill_vertical"
ネストされたScrollView
へ
適切でない可能性のあるクイックソリューションは、アクティビティの作成時に、画面の高さを測定し、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()をオーバーライドすることです。この方法は、特定のピクセル数をスクロールしたことをCoordinatorLayoutに通知するために使用されます。アイデアは、すでにすべてのピクセルをスクロールしたかどうかを計算してから、super.dispatchNestedScrollView()を呼び出すかどうかです。
すでにすべてのコンテンツを表示しているかどうかを計算するには、画面サイズが必要です。子供を繰り返してコンテンツを測定し、すでにスクロールした量を測定します。
物事はフリングでもう少し複雑になります。