BottomSheet + ViewPager2 drag to hide not works BottomSheet + ViewPager2 drag to hide not works android android

BottomSheet + ViewPager2 drag to hide not works


This can be solved by disabling the nested scrolling of the ViewPager2 RecyclerView; but since the RecyclerView can't be directly accessed through the ViewPager2 library. Then it can't be achieved in layout.

So, instead we can get that RecyclerView using java reflection as follows:

Java:

public static RecyclerView getRecyclerView(ViewPager2 viewPager) {    try {        Field field = ViewPager2.class.getDeclaredField("mRecyclerView");        field.setAccessible(true);        return (RecyclerView) field.get(viewPager);    } catch (NoSuchFieldException e) {        e.printStackTrace();    } catch (IllegalAccessException e) {        e.printStackTrace();    }    return null;}

Kotlin:

fun ViewPager2.getRecyclerView(): RecyclerView? {    try {        val field = ViewPager2::class.java.getDeclaredField("mRecyclerView")        field.isAccessible = true        return field.get(this) as RecyclerView    } catch (e: NoSuchFieldException) {        e.printStackTrace()    } catch (e: IllegalAccessException) {        e.printStackTrace()    }    return null}

Then disable the nested scrolling:

Java:

RecyclerView recyclerView = getRecyclerView(viewPager);if (recyclerView != null) {    recyclerView.setNestedScrollingEnabled(false);    recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); // Optional}

Kotlin:

val recyclerView = viewPager.getRecyclerView()recyclerView?.isNestedScrollingEnabled = falserecyclerView?.overScrollMode = View.OVER_SCROLL_NEVER // Optional

This works with me without setting the OverScrollMode, so, if it doesn't work with you can disable the OverScrollMode like above.