私はRecyclerView
を使用してLinearLayoutManager
をHORIZONTAL
内にネストし、FrameLayout
BottomSheet
を使用してBehavior
を使用しています。
RecyclerView
を垂直にドラッグしようとすると、BottomSheet
はドラッグイベントに応答しません。おそらくこれは、水平方向のLayoutManager
の垂直スクロールが無効になっているためです。
私はLinearLayoutManager.canScrollVertically()
をオーバーライドしてtrueを返そうとしました。これはソートです。非常に注意深く垂直方向にドラッグすると、BottomSheet
が応答します。ただし、水平方向の動きが発生するとすぐに、BottomSheet
は垂直方向のドラッグイベントに応答しなくなります。
canScrollVertically()
のオーバーライドがここでの正しいアプローチであるかどうかはわかりません。UXの観点からは、確かに正しくないようです。
また、ViewPager
ではなくRecyclerView
を水平方向のLayoutManager
で使用すると、BottomSheet
が必要に応じて垂直スワイプイベントに応答することにも気付きました。 。
LayoutManager
、RecyclerView
、BottomSheet Behavior
、または垂直スクロールイベントをBottomSheet Behavior
に伝達するのに役立つ他の方法はありますか?
ここに問題の例があります:
https://github.com/timusus/bottomsheet-test (問題はcommit#f59a7031で再現できます)
最初の一番下のシートを展開するだけです。
問題はどこにありますか? FrameLayout
内。 BottomSheet
は、CoordinatorLayout
内に配置すると完全に機能します。次に、BottomSheet
はそのスクロール状態をCoordinatorLayout
を介して、CoordinatorLayout
の直接の子として配置された他のビューに渡すことができます。
RecyclerView
がスクロール状態をBottomSheet
に渡せなかったのはなぜですか? CoordinatorLayout
の直接の子ではありません。しかし、それらを渡す方法があります。RecyclerView
は、 NestedScrollingParent
と NestedScrollingChild
を実装するビューに配置する必要があります。その答えは: NestedScrollView
したがって、_fragment_sheetX.xml
_レイアウトは次のようになります。
_<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.NestedScrollView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#fff"
Android:orientation="vertical"
Android:fillViewport="true">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recyclerView"
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>
</Android.support.v4.widget.NestedScrollView>
_
また、_Android:fillViewport="true"
_にも注意してください。そうでない場合、RecyclerView
は高さ全体を取りません。
ただし、それでも機能しません。どうして? RecyclerView
は、垂直スクロールを親に渡すように指示する必要があります。どうやって?答えはrecyclerView.setNestedScrollingEnabled(false);
ですが、より詳しく説明されています here 。
ところで:MultiSheetView
は優れた機能であり、モバイルUX設計への非常に興味深いアプローチです。