5

私はXMLでアクティビティを持っています。以下のような2つのCoordinatorLayout + AppBarLayoutのスクロールを同期させる方法

何か:ViewPager

<?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> 

FragmentCoordinatorLayoutと+ CollapsingToolbarLayoutAppBarLayoutを持っています。

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> 

フラグメントはバナー、RelativeLayoutを持っています。私はこれら2つのスクロールを同期させたいので、内側のAppBarが崩壊する前に、外側のAppBarが前後に崩壊するようにします。私はオフセットの変更リスナに応じて2つのAppBarsのスクロールフラグを設定したり解除したりしようとしましたが、ちょっとうまく動作しますがスムーズなスクロール効果はありません。バナーが正常に動作する限り、フラグメントのXMLを完全に変更できます。

また、CollapsingToolbarLayoutが折りたたみ/展開されたときに、スタイルを変更する/ TabLayoutのsetTabTextColorsを呼び出す方法はありますか?いずれかの前/後に崩壊するアプリケーションバーの外 よう

+0

あなたは1つにそれらをマージしたいと思いますか?また、** CollapseingToolbarLayoutが**別のトピックを開いたりASKの質問を使用してそれを尋ねるように崩壊したり拡張したりすると、スタイルを変更する方法がある/ TabLayoutのsetTabTextColorsを呼び出します。 – Mohsen

答えて

0

どのように私は内部のアプリケーションバーの崩壊(それは前または後に を発生した場合は関係ありません)これらの2 AppBarLayoutsのスクロールを同期することができますか?

FragmentCoordinatorLayoutだけが(Fragment用)ルートタグとしてRelativeLayoutを使用して、MainActivityにそのViewPagerであなたの詰め込むを行うことを削除します。例えば

、このようにそのCoordinatorLayout内で使用:

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

Githubの例:

https://github.com/TheLittleNaruto/SupportDesignExample

それとも、あなたはNestedScrollView内部ViewPagerことをスクロールしたいが、あなた問題が発生したら、その内部に次のコードを使用してください:

app:layout_behavior="@string/appbar_scrolling_view_behavior" 

これはかなりです。

ViewPagerの断片はCoordinatorLayoutと AppBarLayout + CollapsingToolbarLayoutを有しています。 XML:

これらを2回使用する必要はありません。

4

私は前と同じ問題に直面しています。最後に、SwipeRefreshLayoutから解決策を見つけました。 CoordinatorLayoutを拡張し、NestedScrollingChildインターフェイスを実装するだけです。できます!ここ

は私のコードです:

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]; 
    } 
} 

}

あなたのフラグメントのレイアウトでそれを使用してください。

+0

Bosssssssssssss –

関連する問題