diff --git a/vpbs/src/main/java/android/support/v4/view/ViewPagerUtils.java b/vpbs/src/main/java/android/support/v4/view/ViewPagerUtils.java new file mode 100644 index 0000000..b84d8f7 --- /dev/null +++ b/vpbs/src/main/java/android/support/v4/view/ViewPagerUtils.java @@ -0,0 +1,19 @@ +package android.support.v4.view; + +import android.view.View; + +public class ViewPagerUtils { + + public static View getCurrentView(ViewPager viewPager) { + final int currentItem = viewPager.getCurrentItem(); + for (int i = 0; i < viewPager.getChildCount(); i++) { + final View child = viewPager.getChildAt(i); + final ViewPager.LayoutParams layoutParams = (ViewPager.LayoutParams) child.getLayoutParams(); + if (!layoutParams.isDecor && currentItem == layoutParams.position) { + return child; + } + } + return null; + } + +} diff --git a/vpbs/src/main/java/biz/laenger/android/vpbs/BottomSheetUtils.java b/vpbs/src/main/java/biz/laenger/android/vpbs/BottomSheetUtils.java new file mode 100644 index 0000000..3a45b26 --- /dev/null +++ b/vpbs/src/main/java/biz/laenger/android/vpbs/BottomSheetUtils.java @@ -0,0 +1,51 @@ +package biz.laenger.android.vpbs; + +import android.support.design.widget.CoordinatorLayout; +import android.support.v4.view.ViewPager; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; + +public final class BottomSheetUtils { + + public static void setupViewPager(ViewPager viewPager) { + final View bottomSheetParent = findBottomSheetParent(viewPager); + if (bottomSheetParent != null) { + viewPager.addOnPageChangeListener(new BottomSheetViewPagerListener(viewPager, bottomSheetParent)); + } + } + + private static class BottomSheetViewPagerListener extends ViewPager.SimpleOnPageChangeListener { + private final ViewPager viewPager; + private final ViewPagerBottomSheetBehavior behavior; + + public BottomSheetViewPagerListener(ViewPager viewPager, View bottomSheetParent) { + this.viewPager = viewPager; + this.behavior = ViewPagerBottomSheetBehavior.from(bottomSheetParent); + } + + @Override + public void onPageSelected(int position) { + viewPager.post(new Runnable() { + @Override + public void run() { + behavior.invalidateScrollingChild(); + } + }); + } + } + + private static View findBottomSheetParent(final View view) { + View current = view; + while (current != null) { + final ViewGroup.LayoutParams params = current.getLayoutParams(); + if (params instanceof CoordinatorLayout.LayoutParams && ((CoordinatorLayout.LayoutParams) params).getBehavior() instanceof ViewPagerBottomSheetBehavior) { + return current; + } + final ViewParent parent = current.getParent(); + current = parent == null || !(parent instanceof View) ? null : (View) parent; + } + return null; + } + +} diff --git a/vpbs/src/main/java/biz/laenger/android/vpbs/ViewPagerBottomSheetBehavior.java b/vpbs/src/main/java/biz/laenger/android/vpbs/ViewPagerBottomSheetBehavior.java index 4872ef8..9472b1e 100644 --- a/vpbs/src/main/java/biz/laenger/android/vpbs/ViewPagerBottomSheetBehavior.java +++ b/vpbs/src/main/java/biz/laenger/android/vpbs/ViewPagerBottomSheetBehavior.java @@ -31,6 +31,8 @@ import android.support.v4.view.NestedScrollingChild; import android.support.v4.view.VelocityTrackerCompat; import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPager; +import android.support.v4.view.ViewPagerUtils; import android.support.v4.widget.ViewDragHelper; import android.util.AttributeSet; import android.view.MotionEvent; @@ -391,6 +393,11 @@ public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, V child, Vi velocityX, velocityY)); } + void invalidateScrollingChild() { + final View scrollingChild = findScrollingChild(mViewRef.get()); + mNestedScrollingChildRef = new WeakReference<>(scrollingChild); + } + /** * Sets the height of the bottom sheet when it is collapsed. * @@ -548,7 +555,14 @@ private View findScrollingChild(View view) { if (view instanceof NestedScrollingChild) { return view; } - if (view instanceof ViewGroup) { + if (view instanceof ViewPager) { + ViewPager viewPager = (ViewPager) view; + View currentViewPagerChild = ViewPagerUtils.getCurrentView(viewPager); + View scrollingChild = findScrollingChild(currentViewPagerChild); + if (scrollingChild != null) { + return scrollingChild; + } + } else if (view instanceof ViewGroup) { ViewGroup group = (ViewGroup) view; for (int i = 0, count = group.getChildCount(); i < count; i++) { View scrollingChild = findScrollingChild(group.getChildAt(i));