16

CorodinatorLayoutもう1つはCoordinatorLayoutです。そのため、子ビューをスクロールすると親CoordinatorLayoutもスクロールする必要があります。コーディネーター別のコーディネーターのレイアウト内に配置

私は別のFragmentは、このようなScrolltabLayout

を非表示になります私はviewPagerを持つ別のcoordinatorLayoutを持っていることを含んでViewPagercoordinatorLayoutを持っています。このfragmentは、親フラグメント(親Coordinator layout)のViewPagerで膨らまされている。

問題がonScrollingあるchildViewpager内の子の断片のみが、私はtablayoutを非表示に行う必要があり、親coordinator layoutに子供fragmentcoordinator layoutないで反映されます。

構造は次のとおりです。

CoordinatorLayout(p) ->(tablayout(p) & ViewPager(p) -> CoordinatorLayout(c) ->(tablayout(c) & ViewPAger(c) ->recyclerView(cc))) 

p -> parent; 

c -> child; cc -> child to child 

ツールバーtablayout(P)が得る非表示になるようにリサイクルビューがコーディネータレイアウトの両方に影響を与えますスクロールに作る方法。

+0

これはコードを整理するのに役立ちます。http://developer.android.com/reference/android/support/v4/widget/NestedScrollView.html – j2emanue

+0

あなたはそれを理解しましたか?私は同じ正確な問題を抱えています – Atieh

+0

私は同じ問題を修正しています。どうやってそれを解決するのですか? – KingWu

答えて

0

残念ながら、CoordinatorLayoutではサポートされていません。

NestedScrollingChildHelper.startNestedScroll()CoordinatorLayout.onStartNestedScroll()でコードを確認してくださいあなたの内側のCoordinatorLayoutBehavior Sの一つは、それを消費し、さらに増殖しない場合、ネストされたスクロールイベントを「消費」されます。

0

CHILD CoordinatorLayoutをカスタム化する必要があります.NestedScrollingChild(ori coordinatorlayoutは実装していません)を実装し、ネストされたスクロールイベントをPARENT CoordinatorLayoutにディスパッチできるようにする関数をオーバーライドします。

8

ネストされたコーディネーターレイアウトを簡単に実装します。


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

私はそれが古い質問だと知っています。 しかし、私は長い間、CoordinatorLayoutを別の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); 
    } 
} 
+1

これは私のために働く、ありがとう! –

+2

これは、ありがたいことです。このコードは、すべてのスクロールアクションを常に内部および外部のCoordinatorLayoutに渡します。上の/下にスクロールされるまでスクロールを消費し続けるように内部のものだけを許可するために私がしなければならなかった1つのわずかな変更は 'onNestedPreScroll()'のこの行でした: 'dispatchNestedPreScroll(dx - tConsumed [0] [0]、dy - tConsumed [0] ] [1]、tConsumed [1]、null); '。 – SqueezyMo

+5

これをサポートライブラリv26で使用できるようにするには、onNestedPreScroll、onNestedScroll、onStopNestedScrollおよびonStartNestedScrollのすべてを型パラメータでオーバーライドします。また、これらのメソッドの型パラメータでヘルパー正しいメソッドを呼び出します。 – Marc

2

これをライブラリにしました。on GitHubを参照してください。

あなたのレイアウトには<NestedScrollCoordinatorLayout>を使用してください。

関連する問題