web-dev-qa-db-ja.com

垂直スクロールを防ぐBottomSheetにネストされたRecyclerView(水平)

私はRecyclerViewを使用してLinearLayoutManagerHORIZONTAL内にネストし、FrameLayoutBottomSheetを使用してBehaviorを使用しています。

RecyclerViewを垂直にドラッグしようとすると、BottomSheetはドラッグイベントに応答しません。おそらくこれは、水平方向のLayoutManagerの垂直スクロールが無効になっているためです。

私はLinearLayoutManager.canScrollVertically()をオーバーライドしてtrueを返そうとしました。これはソートです。非常に注意深く垂直方向にドラッグすると、BottomSheetが応答します。ただし、水平方向の動きが発生するとすぐに、BottomSheetは垂直方向のドラッグイベントに応答しなくなります。

canScrollVertically()のオーバーライドがここでの正しいアプローチであるかどうかはわかりません。UXの観点からは、確かに正しくないようです。

また、ViewPagerではなくRecyclerViewを水平方向のLayoutManagerで使用すると、BottomSheetが必要に応じて垂直スワイプイベントに応答することにも気付きました。 。

LayoutManagerRecyclerViewBottomSheet Behavior、または垂直スクロールイベントをBottomSheet Behaviorに伝達するのに役立つ他の方法はありますか?

ここに問題の例があります:

https://github.com/timusus/bottomsheet-test (問題はcommit#f59a7031で再現できます)

最初の一番下のシートを展開するだけです。

16
Tim Malseed

問題はどこにありますか? FrameLayout内。 BottomSheetは、CoordinatorLayout内に配置すると完全に機能します。次に、BottomSheetはそのスクロール状態をCoordinatorLayoutを介して、CoordinatorLayoutの直接の子として配置された他のビューに渡すことができます。

RecyclerViewがスクロール状態をBottomSheetに渡せなかったのはなぜですか? CoordinatorLayoutの直接の子ではありません。しかし、それらを渡す方法があります。RecyclerViewは、 NestedScrollingParentNestedScrollingChild を実装するビューに配置する必要があります。その答えは: 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設計への非常に興味深いアプローチです。

28
R. Zagórski