КоординаторЛайт внутри другого координатораLayout

CorodinatorLayout внутри другого CoordinatorLayout , так что прокрутка детского просмотра также должна прокручиваться в Parent CoordinatorLayout .

У меня есть coordinatorLayout с ViewPager который содержит разные Fragment , так что в Scroll будет tabLayout

У меня есть другой coordinatorLayout , у которого есть viewPager . Этот fragment ViewPager в ViewPager родительского фрагмента ( Coordinator layout родительского Coordinator layout ).

Проблема заключается в onScrolling дочернего фрагмента в childViewpager только отражает в coordinator layout дочернего fragment а не в coordinator layout родителя, который мне нужно сделать, чтобы скрыть tablayout .

Структура:

 CoordinatorLayout(p) ->(tablayout(p) & ViewPager(p) -> CoordinatorLayout(c) ->(tablayout(c) & ViewPAger(c) ->recyclerView(cc))) p -> parent; c -> child; cc -> child to child 

Как сделать просмотр прокрутки ресайклеров повлияет на расположение обоих координаторов, чтобы вкладка tablayout (p) панели инструментов была скрыта .

Я знаю, что это старый вопрос. Но я долго искал включение координатораLayout в фрагмент, который находится в другом CoordinatorLayout.

Я немного изменил ответ dev.bmax, чтобы называть оба координатора макетами и вызывать приложенные действия обоих макетов.

Итак, вот мое решение.

 @SuppressWarnings("unused") public class NestedCoordinatorLayout extends CoordinatorLayout implements NestedScrollingChild { private NestedScrollingChildHelper mChildHelper; public NestedCoordinatorLayout(Context context) { super(context); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } public NestedCoordinatorLayout(Context context, AttributeSet attrs) { super(context, attrs); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } public NestedCoordinatorLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } @Override public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) { /* Enable the scrolling behavior of our own children */ boolean tHandled = super.onStartNestedScroll(child, target, nestedScrollAxes); /* Enable the scrolling behavior of the parent's other children */ return startNestedScroll(nestedScrollAxes) || tHandled; } @Override public void onStopNestedScroll(View target) { /* Disable the scrolling behavior of our own children */ super.onStopNestedScroll(target); /* Disable the scrolling behavior of the parent's other children */ stopNestedScroll(); } @Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { int[][] tConsumed = new int[2][2]; super.onNestedPreScroll(target, dx, dy, tConsumed[0]); dispatchNestedPreScroll(dx, dy, tConsumed[1], null); consumed[0] = tConsumed[0][0] + tConsumed[1][0]; consumed[1] = tConsumed[0][1] + tConsumed[1][1]; } @Override public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null); } @Override public boolean onNestedPreFling(View target, float velocityX, float velocityY) { boolean tHandled = super.onNestedPreFling(target, velocityX, velocityY); return dispatchNestedPreFling(velocityX, velocityY) || tHandled; } @Override public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) { boolean tHandled = super.onNestedFling(target, velocityX, velocityY, consumed); return dispatchNestedFling(velocityX, velocityY, consumed) || tHandled; } @Override public void setNestedScrollingEnabled(boolean enabled) { mChildHelper.setNestedScrollingEnabled(enabled); } @Override public boolean isNestedScrollingEnabled() { return mChildHelper.isNestedScrollingEnabled(); } @Override public boolean startNestedScroll(int axes) { return mChildHelper.startNestedScroll(axes); } @Override public void stopNestedScroll() { mChildHelper.stopNestedScroll(); } @Override public boolean hasNestedScrollingParent() { return mChildHelper.hasNestedScrollingParent(); } @Override public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) { return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow); } @Override public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); } @Override public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); } @Override public boolean dispatchNestedPreFling(float velocityX, float velocityY) { return mChildHelper.dispatchNestedPreFling(velocityX, velocityY); } } 

Вот простая реализация макета вложенного координатора.

 /** * This variation of CoordinatorLayout also serves as a nested scrolling child, * which supports passing nested scrolling operations to it's parent when it's * own nested scrolling is locked. */ public class NestedCoordinatorLayout extends CoordinatorLayout implements NestedScrollingChild { private NestedScrollingChildHelper mChildHelper; private volatile boolean mPassToParent; public NestedCoordinatorLayout(Context context) { super(context); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } public NestedCoordinatorLayout(Context context, AttributeSet attrs) { super(context, attrs); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } public NestedCoordinatorLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } /** * Locks the nested scrolling. Further scroll events will * be passed to the nested scrolling parent. */ public void lockNestedScrolling() { mPassToParent = true; } /** * Unlocks the nested scrolling. Further scroll events will * be dispatched to this layout's own scrolling children. */ public void unlockNestedScrolling() { mPassToParent = false; } /* * NestedScrollingParent implementation */ @Override public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) { /* Enable the scrolling behavior of our own children */ super.onStartNestedScroll(child, target, nestedScrollAxes); /* Enable the scrolling behavior of the parent's other children */ startNestedScroll(nestedScrollAxes); /* Start tracking the current scroll */ return true; } @Override public void onStopNestedScroll(View target) { /* Disable the scrolling behavior of our own children */ super.onStopNestedScroll(target); /* Disable the scrolling behavior of the parent's other children */ stopNestedScroll(); } @Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { if (mPassToParent) { dispatchNestedPreScroll(dx, dy, consumed, null); } else { super.onNestedPreScroll(target, dx, dy, consumed); } } @Override public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { if (mPassToParent) { dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null); } else { super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); } } @Override public boolean onNestedPreFling(View target, float velocityX, float velocityY) { if (mPassToParent) { return dispatchNestedPreFling(velocityX, velocityY); } else { return super.onNestedPreFling(target, velocityX, velocityY); } } @Override public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) { if (mPassToParent) { return dispatchNestedFling(velocityX, velocityY, consumed); } else { return super.onNestedFling(target, velocityX, velocityY, consumed); } } /* * NestedScrollingChild implementation */ @Override public void setNestedScrollingEnabled(boolean enabled) { mChildHelper.setNestedScrollingEnabled(enabled); } @Override public boolean isNestedScrollingEnabled() { return mChildHelper.isNestedScrollingEnabled(); } @Override public boolean startNestedScroll(int axes) { return mChildHelper.startNestedScroll(axes); } @Override public void stopNestedScroll() { mChildHelper.stopNestedScroll(); } @Override public boolean hasNestedScrollingParent() { return mChildHelper.hasNestedScrollingParent(); } @Override public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) { return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow); } @Override public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); } @Override public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); } @Override public boolean dispatchNestedPreFling(float velocityX, float velocityY) { return mChildHelper.dispatchNestedPreFling(velocityX, velocityY); } } 

Я сделал это в библиотеке, посмотри на GitHub .

Вы просто используете <NestedScrollCoordinatorLayout> в своем макете.

К сожалению, это не поддерживается CoordinatorLayout .

Проверьте код в NestedScrollingChildHelper.startNestedScroll() и CoordinatorLayout.onStartNestedScroll() , вложенное событие прокрутки «потребляется», если одно из Behavior s вашего внутреннего CoordinatorLayout потребляет его и не будет распространяться дальше.

Вам нужно настроить свой CHILD CoordinatorLayout, позволить ему реализовать NestedScrollingChild (ori coordinatorlayout не реализовал его) и переопределить некоторые функции, чтобы включить отправку вложенного события прокрутки в ваш PARENT CoordinatorLayout.