web-dev-qa-db-ja.com

NestedScrollViewがスクロールするコンテンツを使い果たした後、CollapsingToolbarが崩壊するのを停止します

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>

example

25
chase

追加するだけです

Android:layout_gravity="fill_vertical"

nestedScrollViewで。 :)

15
venturidoo

今日、私はこれを行うカスタムビヘイビアを作成しました。

AppBarLayout.ScrollingViewBehaviorを拡張するため、スクロールビュー(NestedScrollViewなど)で設定する必要があります。

あなたはそれを見つけることができます Github上 、それが機能するかどうか私に知らせてください。

重要な部分は、コンテンツの高さに基づいてAppBarLayoutの折りたたみ高さをプログラムで設定することです。これにより、終了するとスクロールが停止します。

3
natario

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の内容は必要に応じて機能します。

2
Ankii Rawat

スクロール時にappBarLayoutをスクリミングしないように、以下のコードとともに natarioのソリューション を使用することをお勧めします。

app:scrimVisibleHeightTrigger="?attr/actionBarSize"

1
DPanic284

以下の行を追加します

Android:layout_gravity="fill_vertical"

ネストされたScrollView

1
NarenderNishad

適切でない可能性のあるクイックソリューションは、アクティビティの作成時に、画面の高さを測定し、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()を呼び出すかどうかです。

すでにすべてのコンテンツを表示しているかどうかを計算するには、画面サイズが必要です。子供を繰り返してコンテンツを測定し、すでにスクロールした量を測定します。

物事はフリングでもう少し複雑になります。

1
juanmeanwhile