バックグラウンド
多くのアプリで表示されているのと同じ機能を追加しようとしています。この機能では、スクロールされたコンテンツに応じて画面の上部領域が縮小および拡大します。
このために、CheeseSquare サンプルに示されているように、Google のデザイン ライブラリを使用します。
問題
つまり、 NestedScrollView にどれだけのコンテンツがあっても、コンテンツの最後のビューの下にスクロールして、アクションバーの最終的な状態を最小サイズで表示できるようにします。
要するに、これは私が一番下までスクロールしたときに表示されるものです (CheeseSquare サンプルの変更されたコンテンツ):
これは、一番下までスクロールするときに必要なものです(連絡先アプリから取得):
また、 ThreePhasesBottomSheetサンプルで、peek 状態でも一番下のシートのコンテンツをスクロールできるというバグを修正しようとしています。再現するには、水平方向のスクロールを開始し (この方法ではスクロールするものが何もないため、何もしません)、次に垂直方向にスクロールします。これにより、ボトムシートのコンテンツのスクロールが何らかの形でトリガーされます。
したがって、「transformView()」メソッドでスクロールを無効にする必要があります。
これは、通常の使用法を使用してどのように機能するかです。
そして、これはスクロールをブロックしないというバグでどのように動作するかです:
私が試したこと
「layout_scrollFlags」フラグをいじって、高さを wrap_content に変更し、clipToPadding と FitsSystemWindows 属性を削除しようとしました。
サンプルの XML ファイルを次に示します。このファイルは、複数の cardView ではなく 1 つの cardView のみを含むように変更しました。
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
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.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="24dp">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/card_margin">
<LinearLayout
style="@style/Widget.CardContent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Info"
android:textAppearance="@style/TextAppearance.AppCompat.Title" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/cheese_ipsum" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:layout_height="wrap_content"
android:layout_width="wrap_content"
app:layout_anchor="@id/appbar"
app:layout_anchorGravity="bottom|right|end"
android:src="@drawable/ic_discuss"
android:layout_margin="@dimen/fab_margin"
android:clickable="true"/>
</android.support.design.widget.CoordinatorLayout>
次のコードも試しました:
((AppBarLayout.LayoutParams) collapsingToolbar.getLayoutParams()).setScrollFlags(0);
ただし、これにより、 CheeseSquareの例では NestedScrollView 自体のスクロールが許可され、 ThreePhasesBottomSheetサンプルではフリングも許可されました。
質問
下部に表示するコンテンツがなくなったときにスクロールを停止するにはどうすればよいですか?
さらに、( ThreePhasesBottomSheetサンプルの場合) いつでも NestedScrollView のスクロールを無効にするにはどうすればよいですか? 「setEnableScrolling(...)」のようなものですか?
NestedScrollView を拡張しようとしましたが、ScrollingViewBehavior からも拡張しようとしましたが、スクロールを無効にするためにできることを見つけることができませんでした。
変更するのはおそらく非常に簡単なことですが、何がわかりません...
編集:必要に応じて、これは私が現在デザインとサポートライブラリに使用しているものです
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:design:23.1.0'
編集: #2 については、BottomSheetLayout.java ファイル内から回避策を見つけて、常に「false」に設定されているかのように、変数「sheetViewOwnsTouch」に関連するすべてを無効にしました。これにより、一番下のシートでタッチ イベントを盗むことができます。ただし、これは単なる回避策であり、この場合のみです。また、他のビューによって処理されるべきであったいくつかのタッチ イベントも発生します。プログラムでスクロールをブロックする方法を知りたいのですが、コンテンツを表示するのに十分なスペースがある場合もあります。