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.