AppBarLayout + TabLayout + CollapsingToolbarLayout + SwipeToRefresh

匿名 (未验证) 提交于 2019-12-03 02:48:02

问题:

I met a lot of issues related with my problem but nobody I found wanted the behaviour I'm looking for.

I want a view pager with tabs and app bar, when the contained fragments are scrollable and are scrolled (toward bottom), I want the app bar to disapear but leave the tabs, when scrolled toward top, to re-apear. some of these fragments contain a SwipeToRefresh Layout (sometimes it causes problems). I tried a lot of configurations that always leave something wrong.

for now I don't have the collapsing effect (it's always hidden)

<?xml version="1.0" encoding="utf-8"?> <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:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainPagerActivity">  <RelativeLayout     android:layout_width="match_parent"     android:layout_height="match_parent">      <android.support.design.widget.AppBarLayout         android:id="@+id/app_bar_layout"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">          <android.support.design.widget.CollapsingToolbarLayout             android:id="@+id/collapsing_toolbar"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:fitsSystemWindows="true"             app:contentScrim="?attr/colorPrimary"             app:expandedTitleMarginEnd="64dp"             app:expandedTitleMarginStart="48dp"             app:layout_scrollFlags="scroll|enterAlways">               <android.support.v7.widget.Toolbar                 android:id="@+id/toolbar"                 android:layout_width="match_parent"                 android:layout_height="?attr/actionBarSize"                 android:background="?attr/colorPrimary"                 app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />              <android.support.design.widget.TabLayout                 android:id="@+id/tabs"                 android:layout_width="match_parent"                 android:layout_height="wrap_content"                 app:tabGravity="fill"                 app:tabIndicatorHeight="6dp"                 app:tabMode="fixed" />          </android.support.design.widget.CollapsingToolbarLayout>     </android.support.design.widget.AppBarLayout>       <android.support.v4.view.ViewPager         android:id="@+id/main_pager"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:layout_below="@id/app_bar_layout"         tools:context=".MainPagerActivity"          />  </RelativeLayout>  <android.support.design.widget.FloatingActionButton     android:id="@+id/fab"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:layout_gravity="bottom|end"     android:layout_margin="@dimen/fab_margin"     android:src="@android:drawable/ic_menu_edit" /> 

and one of my fragment (the scrolling one) :

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     xmlns:wheel="http://schemas.android.com/apk/res-auto"     android:layout_width="match_parent"     android:layout_height="match_parent"     tools:context="com.m360learning.app.fragment.MainPagerNewsFeed">       <android.support.v4.widget.SwipeRefreshLayout         android:id="@+id/swipeRefreshLayout"         android:layout_width="match_parent"         android:layout_height="match_parent">          <RelativeLayout             android:layout_width="match_parent"             android:layout_height="match_parent">              <com.pnikosis.materialishprogress.ProgressWheel                 android:id="@+id/progress_wheel"                 android:layout_width="80dp"                 android:layout_height="80dp"                 android:layout_centerHorizontal="true"                 android:layout_centerVertical="true"                 wheel:matProg_barColor="#5588FF"                 wheel:matProg_progressIndeterminate="true" />              <android.support.v7.widget.RecyclerView                 android:id="@+id/recycler"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:scrollbars="vertical" />          </RelativeLayout>      </android.support.v4.widget.SwipeRefreshLayout>  </FrameLayout> 

I don't know exactly what I've done but from the time I started write this question the refreshLayout prevent my List from going up (it refreshes instead)..

Thanks

------Correction !

thanks to Sir Ellie Zou, it now works with this xml :

<?xml version="1.0" encoding="utf-8"?> <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:layout_width="match_parent"     android:layout_height="match_parent"     android:fitsSystemWindows="true"     tools:context=".MainPagerActivity">       <android.support.design.widget.AppBarLayout         android:id="@+id/app_bar_layout"         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="?attr/colorPrimary"                 app:layout_collapseMode="pin"                 app:layout_scrollFlags="scroll|enterAlways"                 app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />              <android.support.design.widget.TabLayout                 android:id="@+id/tabs"                 android:layout_width="match_parent"                 android:layout_height="wrap_content"                 app:tabGravity="fill"                 app:tabIndicatorHeight="6dp"                 app:tabMode="fixed" />      </android.support.design.widget.AppBarLayout>       <android.support.v4.view.ViewPager         android:id="@+id/main_pager"         android:layout_width="match_parent"         android:layout_height="match_parent"         tools:context=".MainPagerActivity"         app:layout_behavior="@string/appbar_scrolling_view_behavior"          />       <android.support.design.widget.FloatingActionButton         android:id="@+id/fab"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_gravity="bottom|end"         android:layout_margin="@dimen/fab_margin"         android:src="@android:drawable/ic_menu_edit" />   </android.support.design.widget.CoordinatorLayout> 

and the fragment layout :

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     xmlns:wheel="http://schemas.android.com/apk/res-auto"     android:layout_width="match_parent"     android:layout_height="match_parent"     tools:context="com.m360learning.app.fragment.MainPagerNewsFeed">       <com.pnikosis.materialishprogress.ProgressWheel         android:id="@+id/progress_wheel"         android:layout_width="80dp"         android:layout_height="80dp"         android:layout_gravity="center"         wheel:matProg_barColor="#5588FF"         wheel:matProg_progressIndeterminate="true" />      <android.support.v4.widget.SwipeRefreshLayout         android:id="@+id/swipeRefreshLayout"         android:layout_width="match_parent"         android:layout_height="match_parent">           <android.support.v7.widget.RecyclerView             android:id="@+id/recycler"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:scrollbars="vertical" />       </android.support.v4.widget.SwipeRefreshLayout>   </FrameLayout> 

回答1:

If you don't want parallax effect, you don't need to use CollapsingToolbarLayout.

Most important configuration:

In Toolbar, set app:layout_scrollFlags="scroll|enterAlways".

In ViewPager, set app:layout_behavior="@string/appbar_scrolling_view_behavior".

And layout should look like this:

<android.support.design.widget.CoordinatorLayout>      <android.support.design.widget.AppBarLayout>          <android.support.v7.widget.Toolbar/>          <android.support.design.widget.TabLayout/>      </android.support.design.widget.AppBarLayout>      <android.support.v4.view.ViewPager/>      <android.support.design.widget.FloatingActionButton/>  </android.support.design.widget.CoordinatorLayout> 

Move ProgressWheel out of your SwipeRefreshLayout to fix your problem that SwipeRefreshLayout can't refresh.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!