5

Ho un'attività con XML.Come sincronizzare lo scorrimento di due CoordinatorLayout + AppBarLayout

Qualcosa di simile:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

    <android.support.design.widget.CoordinatorLayout 
     android:id="@+id/coordinator" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.design.widget.AppBarLayout 
      android:id="@+id/appbar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="@color/primary" 
       android:theme="@style/ToolbarStyle" 
       android:gravity="center_vertical" 
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
       app:layout_scrollFlags="scroll|enterAlways|snap" 
       style="@style/bold" /> 

      <android.support.design.widget.TabLayout 
       android:id="@+id/tabs" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:theme="@style/TabLayoutStyle" 
       android:animateLayoutChanges="true" 
       app:tabGravity="fill" 
       app:tabMode="fixed" 
       app:tabTextAppearance="@style/TabStyle"/> 

     </android.support.design.widget.AppBarLayout> 

     <com.wedmegood.planner.view.XViewPager 
      android:id="@+id/main_container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="fill_vertical" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

     ... 

</android.support.v4.widget.DrawerLayout> 

Una Fragment del ViewPager ha un CoordinatorLayout e AppBarLayout + CollapsingToolbarLayout.

s' Fragment XML:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/root" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/primaryDark" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fitsSystemWindows="true" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapse_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/my_wedding_banner_height" 
      android:minHeight="48dp" 
      android:fitsSystemWindows="true" 
      app:contentScrim="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"> 

      <RelativeLayout 
       android:id="@+id/banner" 
       android:layout_width="match_parent" 
       android:layout_marginTop="0dp" 
       android:layout_height="match_parent" 
       app:layout_collapseMode="none"> 


      </RelativeLayout> 

      <android.support.design.widget.TabLayout 
       android:id="@+id/tabs" 
       android:layout_width="match_parent" 
       android:layout_height="48dp" 
       android:layout_gravity="bottom" 
       android:animateLayoutChanges="true" 
       app:tabMode="fixed" 
       app:tabGravity="fill" 
       app:tabTextColor="@color/primary" 
       app:tabSelectedTextColor="@color/primary" 
       app:tabIndicatorColor="@color/accent" 
       app:tabIndicatorHeight="4dp" 
       app:tabTextAppearance="@style/TabStyle"/> 

     </android.support.design.widget.CollapsingToolbarLayout> 

    </android.support.design.widget.AppBarLayout> 

     <com.wedmegood.planner.view.XViewPager 
      android:id="@+id/viewpager" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

</android.support.design.widget.CoordinatorLayout> 

Il frammento ha un banner, il RelativeLayout. Voglio sincronizzare lo scorrimento di questi due AppBarLayouts in modo che l'AppBar esterno comprima prima/dopo (non importa se succede prima o dopo) l'interno di AppBar collassa? Ho provato a impostare e disabilitare i flag di scorrimento di 2 AppBar a seconda del loro listener di modifiche di Offset, funziona in qualche modo ma non dà un effetto di scorrimento uniforme. Posso modificare completamente l'XML del frammento fintanto che il banner funziona correttamente.

Inoltre, c'è un modo per cambiare stile/chiamare il setTabTextColors di TabLayout quando CollapsingToolbarLayout viene compresso/espande?

+0

Vuoi dire, vuoi unirli in uno? inoltre: ** c'è un modo per cambiare stile/chiamare il setTabTextColors di TabLayout quando CollapsingToolbarLayout comprime/espande ** meglio per chiederlo aprendo un altro argomento o usando la domanda ASK. – Mohsen

risposta

0

Come posso sincronizzare rotolo di questi 2 AppBarLayouts in modo che l'esterno appbar crolla sia prima/dopo (non importa se succede prima o dopo) i crolli appbar dentro?

eliminare tale Fragment s' CoordinatorLayout e basta usare RelativeLayout come tag principale (per Fragment) e poi fare i tuoi animali con quella ViewPager nel MainActivity.

Ad esempio, utilizzare dentro che CoordinatorLayout come questo:

<CoordinatorLayout> 
<android.support.v4.view.ViewPager/> 
    <AppbarLayout/> 
    <scrollableView/> 
    <FloatingActionButton/> 
</CoordinatorLayout> 

Github esempio:

https://github.com/TheLittleNaruto/SupportDesignExample

O forse si desidera scorrere che ViewPager all'interno del NestedScrollView ma, Affronteremo un problema quindi utilizzeremo il seguente codice al suo interno:

app:layout_behavior="@string/appbar_scrolling_view_behavior" 

Questo è praticamente tutto.

Un frammento del ViewPager ha un CoordinatorLayout e AppBarLayout + CollapsingToolbarLayout. XML:

Non è necessario utilizzarli due volte.

4

Ho lo stesso problema giorni fa. Finalmente ho trovato una soluzione da SwipeRefreshLayout. Basta estendere CoordinatorLayout e implementare l'interfaccia NestedScrollingChild. Funziona!

Ecco il mio codice:

public class NestedCoordinatorLayout extends CoordinatorLayout implements NestedScrollingChild { 
private final NestedScrollingChildHelper mNestedScrollingChildHelper; 

private final int[] mParentOffsetInWindow = new int[2]; 
private final int[] mParentScrollConsumed = new int[2]; 

public NestedCoordinatorLayout(Context context) { 
    this(context, null, 0); 
} 

public NestedCoordinatorLayout(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public NestedCoordinatorLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    mNestedScrollingChildHelper = new NestedScrollingChildHelper(this); 
    setNestedScrollingEnabled(true); 
} 

// NestedScrollingChild 

@Override 
public void setNestedScrollingEnabled(boolean enabled) { 
    mNestedScrollingChildHelper.setNestedScrollingEnabled(enabled); 
} 

@Override 
public boolean isNestedScrollingEnabled() { 
    return mNestedScrollingChildHelper.isNestedScrollingEnabled(); 
} 

@Override 
public boolean startNestedScroll(int axes) { 
    return mNestedScrollingChildHelper.startNestedScroll(axes); 
} 

@Override 
public void stopNestedScroll() { 
    mNestedScrollingChildHelper.stopNestedScroll(); 
} 

@Override 
public boolean hasNestedScrollingParent() { 
    return mNestedScrollingChildHelper.hasNestedScrollingParent(); 
} 

@Override 
public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, 
            int dyUnconsumed, int[] offsetInWindow) { 
    return mNestedScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, 
      dxUnconsumed, dyUnconsumed, offsetInWindow); 
} 

@Override 
public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { 
    return mNestedScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); 
} 

@Override 
public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { 
    return mNestedScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); 
} 

@Override 
public boolean dispatchNestedPreFling(float velocityX, float velocityY) { 
    return mNestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY); 
} 

@Override 
public void onNestedScrollAccepted(View child, View target, int axes) { 
    super.onNestedScrollAccepted(child, target, axes); 

    // Dispatch up to the nested parent 
    startNestedScroll(axes & ViewCompat.SCROLL_AXIS_VERTICAL); 
} 

@Override 
public void onStopNestedScroll(View target) { 
    super.onStopNestedScroll(target); 
    stopNestedScroll(); 
} 

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

@Override 
public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { 
    super.onNestedPreScroll(target, dx, dy, consumed); 

    final int[] parentConsumed = mParentScrollConsumed; 
    if (dispatchNestedPreScroll(dx - consumed[0], dy - consumed[1], parentConsumed, null)) { 
     consumed[0] += parentConsumed[0]; 
     consumed[1] += parentConsumed[1]; 
    } 
} 

}

usarlo nel layout del frammento.

+0

Bosssssssssssssss –

Problemi correlati