layout_collapsemode collapsing appbar_scrolling_view_behavior android android-viewpager android-coordinatorlayout android-appbarlayout

appbar_scrolling_view_behavior - collapsing toolbar android



CoordinadorLayout dentro de otro CoordinatorLayout (6)

Aquí hay una implementación simple de un diseño de coordinador anidado.

/** * 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); } }

CorodinatorLayout dentro de otro CoordinatorLayout modo que al desplazar la vista secundaria también debería desplazarse el Parent CoordinatorLayout .

Tengo un coordinatorLayout con ViewPager que contiene diferentes Fragment , de manera que en Scroll ocultará el tabLayout

Tengo otro coordinatorLayout que tiene un viewPager . Este fragment se infla en ViewPager del fragmento primario ( Coordinator layout principal).

El problema está en el onScrolling El fragmento secundario en childViewpager solo se refleja en la coordinator layout del coordinator layout del fragment secundario y no en la coordinator layout que necesito hacer para ocultar el tablayout .

la estructura es:

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

La forma de hacer en la vista del reciclador de desplazamiento afectará al diseño de ambos coordinadores, de modo que la barra de herramientas tablayout (p) se ocultará.


Con suerte, esto ayudará a otros. La idea que implementé durante preScroll calcula cuánto puede consumir el padre, si ya es 0, luego llame a super.onNestedPreScroll .

Aquí está el código:

import android.content.Context; import android.support.annotation.Nullable; import android.support.design.widget.CoordinatorLayout; import android.support.v4.view.NestedScrollingChild2; import android.support.v4.view.NestedScrollingChildHelper; import android.util.AttributeSet; import android.view.View; public class NestedScrollCoordinatorLayout extends CoordinatorLayout implements NestedScrollingChild2 { private NestedScrollingChildHelper mChildHelper; public NestedScrollCoordinatorLayout(Context context) { super(context); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } public NestedScrollCoordinatorLayout(Context context, AttributeSet attrs) { super(context, attrs); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } public NestedScrollCoordinatorLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } @Override public boolean isNestedScrollingEnabled() { return mChildHelper.isNestedScrollingEnabled(); } @Override public void setNestedScrollingEnabled(boolean enabled) { mChildHelper.setNestedScrollingEnabled(enabled); } @Override public boolean hasNestedScrollingParent() { return mChildHelper.hasNestedScrollingParent(); } @Override public boolean hasNestedScrollingParent(int type) { return mChildHelper.hasNestedScrollingParent(type); } @Override public boolean onStartNestedScroll(View child, View target, int axes, int type) { boolean superResult = super.onStartNestedScroll(child, target, axes, type); return startNestedScroll(axes, type) || superResult; } @Override public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) { boolean superResult = super.onStartNestedScroll(child, target, nestedScrollAxes); return startNestedScroll(nestedScrollAxes) || superResult; } @Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed, int type) { dispatchNestedPreScroll(dx, dy, consumed, null); if (consumed[1] == 0) { super.onNestedPreScroll(target, dx, dy, consumed, type); } } @Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { dispatchNestedPreScroll(dx, dy, consumed, null); if (consumed[1] == 0) { super.onNestedPreScroll(target, dx, dy, consumed); } } @Override public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) { super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type); dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null, type); } @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 void onStopNestedScroll(View target, int type) { super.onStopNestedScroll(target, type); stopNestedScroll(type); } @Override public void onStopNestedScroll(View target) { super.onStopNestedScroll(target); stopNestedScroll(); } @Override public boolean onNestedPreFling(View target, float velocityX, float velocityY) { boolean superResult = super.onNestedPreFling(target, velocityX, velocityY); return dispatchNestedPreFling(velocityX, velocityY) || superResult; } @Override public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) { boolean superResult = super.onNestedFling(target, velocityX, velocityY, consumed); return dispatchNestedFling(velocityX, velocityY, consumed) || superResult; } @Override public boolean startNestedScroll(int axes, int type) { return mChildHelper.startNestedScroll(axes, type); } @Override public boolean startNestedScroll(int axes) { return mChildHelper.startNestedScroll(axes); } @Override public void stopNestedScroll() { mChildHelper.stopNestedScroll(); } @Override public void stopNestedScroll(int type) { mChildHelper.stopNestedScroll(type); } @Override public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, @Nullable int[] offsetInWindow, int type) { return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow, type); } @Override public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, @Nullable int[] offsetInWindow) { return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow); } @Override public boolean dispatchNestedPreScroll(int dx, int dy, @Nullable int[] consumed, @Nullable int[] offsetInWindow) { return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); } @Override public boolean dispatchNestedPreScroll(int dx, int dy, @Nullable int[] consumed, @Nullable int[] offsetInWindow, int type) { return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow, type); } @Override public boolean dispatchNestedPreFling(float velocityX, float velocityY) { return mChildHelper.dispatchNestedPreFling(velocityX, velocityY); } @Override public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); } }

Vea también esta gist en GithHub


Debe personalizar el Coordinador de NIÑOS, dejar que implemente NestedScrollingChild (ori coordinatorlayout no lo implementó) y anular algunas funciones para habilitar el envío de eventos de desplazamiento anidado a su Coordinador de PADRES.


Desafortunadamente, esto no es compatible con CoordinatorLayout .

Verifique el código en NestedScrollingChildHelper.startNestedScroll() y CoordinatorLayout.onStartNestedScroll() , el evento de desplazamiento anidado se "consume" si uno de los Behavior de su CoordinatorLayout interno lo consume y no se propagará más.


Hice de esto una biblioteca, véala en GitHub .

Solo usa <NestedScrollCoordinatorLayout> en su diseño.


Sé que es una vieja pregunta. Pero busqué mucho tiempo para incluir un CoordinatorLayout en un fragmento, que está en otro CoordinatorLayout .

Modifiqué un poco la respuesta de dev.bmax para llamar a ambos diseños de coordinador y llamar a los comportamientos adjuntos de ambos diseños.

Así que aquí está mi solución.

@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); } }