java - tab bar sticks to the top instead of underneath a collapsing toolbar -


i'm trying create layout integrates both collapsing toolbar tab bar underneath remains visible after user scrolls up. problem tab bar sticks top of screen under mainactivity toolbar. i'm using sliding window activity fragments, , fragment has nested fragments each tab have each own layout. i'm following examples here use support design library achieve this.

my layout code main fragment follows:

<?xml version="1.0" encoding="utf-8"?> <relativelayout     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     android:layout_width="match_parent"     android:layout_height="match_parent">      <android.support.design.widget.coordinatorlayout         xmlns:android="http://schemas.android.com/apk/res/android"         xmlns:app="http://schemas.android.com/apk/res-auto"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:fitssystemwindows="true">          <android.support.design.widget.appbarlayout             android:id="@+id/appbar"             android:layout_width="match_parent"             android:layout_height="250dp"             android:fitssystemwindows="true"             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|enteralwayscollapsed">                  <imageview                     android:id="@+id/header"                     android:layout_width="match_parent"                     android:layout_height="match_parent"                     android:background="@drawable/details_header"                     android:fitssystemwindows="true"                     android:scaletype="centercrop"                     app:layout_collapsemode="parallax"/>                  <android.support.v7.widget.toolbar                     android:id="@+id/anim_toolbar"                     android:layout_width="match_parent"                     android:layout_height="?attr/actionbarsize"                     app:layout_collapsemode="pin"                     app:popuptheme="@style/themeoverlay.appcompat.light"/>              </android.support.design.widget.collapsingtoolbarlayout>          </android.support.design.widget.appbarlayout>          <android.support.v4.view.viewpager             android:id="@+id/tabanim_viewpager"             android:layout_width="match_parent"             android:layout_height="match_parent"             app:layout_behavior="@string/appbar_scrolling_view_behavior"/>          <android.support.design.widget.floatingactionbutton             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:layout_margin="16dp"             android:clickable="true"             android:src="@mipmap/ic_action_share"             app:backgroundtint="@color/primary_dark"             app:layout_anchor="@+id/appbar"             app:layout_anchorgravity="bottom|right|end"/>          <android.support.design.widget.floatingactionbutton             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:layout_margin="16dp"             android:clickable="true"             android:src="@mipmap/ic_action_location"             app:backgroundtint="@color/primary_dark"             app:layout_anchor="@+id/appbar"             app:layout_anchorgravity="bottom|center"/>          <android.support.design.widget.appbarlayout             android:id="@+id/tabanim_appbar"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_alignparentbottom="false"             android:baselinealigned="false"             android:theme="@style/themeoverlay.appcompat.dark.actionbar"             >              <tabhost                 android:id="@android:id/tabhost"                 android:layout_width="match_parent"                 android:layout_height="wrap_content">                  <framelayout                     android:id="@android:id/tabcontent"                     android:layout_width="match_parent"                     android:layout_height="match_parent">                      <android.support.design.widget.tablayout                         android:id="@+id/tabanim_tabs"                         android:layout_width="match_parent"                         android:layout_height="wrap_content"/>                 </framelayout>                  <tabwidget                     android:id="@android:id/tabs"                     android:layout_width="match_parent"                     android:layout_height="wrap_content"/>              </tabhost>         </android.support.design.widget.appbarlayout>      </android.support.design.widget.coordinatorlayout> </relativelayout> 

for instance simplify tab fragment layout, let's assume have recycleview in it:

<?xml version="1.0" encoding="utf-8"?> <framelayout     android:id="@+id/dummyfrag_bg"     xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:background="@color/background_material_light">      <android.support.v7.widget.recyclerview         android:id="@+id/dummyfrag_scrollableview"         android:layout_width="match_parent"         android:layout_height="match_parent"/>  </framelayout> 

the mainactivity layout:

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.drawerlayout     android:id="@+id/drawerlayout"     xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:elevation="7dp">      <linearlayout         android:layout_width="match_parent"         android:layout_height="match_parent"         android:orientation="vertical">          <include             android:id="@+id/toolbar"             layout="@layout/toolbar"/>          <framelayout             android:id="@+id/container"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:clickable="true"/>     </linearlayout>      <android.support.v7.widget.recyclerview         android:id="@+id/recyclerview"         android:layout_width="320dp"         android:layout_height="match_parent"         android:layout_gravity="left"         android:background="@color/white_transparent"         android:scrollbars="vertical"/> </android.support.v4.widget.drawerlayout> 

the toolbar layout:

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.toolbar     android:id="@+id/toolbar"     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     android:layout_width="match_parent"     android:layout_height="wrap_content"     android:background="?attr/colorprimary"     android:minheight="?attr/actionbarsize"     android:theme="@style/themeoverlay.appcompat.dark.actionbar"     app:popuptheme="@style/themeoverlay.appcompat.light"/> 

mainactivity class:

public class mainactivity extends appcompatactivity {  private final static int profile_fragment = 1; private final static int prizes_fragment = 2; private final static int sales_fragment = 3; private final static int = 4; private int currentfragment = 1; private string currentfragmentname = "profilefragment"; public int header_image = r.drawable.avatar;   private drawerlayout drawer; private list<draweritem> datalist;  @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_main);     toolbar mtoolbar = (toolbar) findviewbyid(r.id.toolbar);     if (mtoolbar != null) {         setsupportactionbar(mtoolbar);     }     recyclerview mrecyclerview = (recyclerview) findviewbyid(r.id.recyclerview);     mrecyclerview.sethasfixedsize(true);      datalist = new arraylist<>();     additemstodatalist();      navdraweradapter madapter = new navdraweradapter(datalist, this, "person name", "person email", header_image);     mrecyclerview.setadapter(madapter);     recyclerview.layoutmanager mlayoutmanager = new linearlayoutmanager(this);     mrecyclerview.setlayoutmanager(mlayoutmanager);      drawer = (drawerlayout) findviewbyid(r.id.drawerlayout);     drawer.setdescendantfocusability(viewgroup.focus_block_descendants);     actionbardrawertoggle mdrawertoggle = new actionbardrawertoggle(             this, drawer, mtoolbar, r.string.navigation_drawer_open, r.string.navigation_drawer_close) {         @override         public void ondraweropened(view drawerview) {             super.ondraweropened(drawerview);         }          @override         public void ondrawerclosed(view drawerview) {             super.ondrawerclosed(drawerview);         }     };     drawer.setdrawerlistener(mdrawertoggle);     mdrawertoggle.syncstate();     ontouchdrawer(currentfragment);     final gesturedetector mgesturedetector =             new gesturedetector(mainactivity.this, new gesturedetector.simpleongesturelistener() {                 @override                 public boolean onsingletapup(motionevent e) {                     return true;                 }             });     mrecyclerview.addonitemtouchlistener(new recyclerview.onitemtouchlistener() {         @override         public boolean onintercepttouchevent(recyclerview recyclerview, motionevent motionevent) {             view child = recyclerview.findchildviewunder(motionevent.getx(), motionevent.gety());              if (child != null && mgesturedetector.ontouchevent(motionevent)) {                 drawer.closedrawers();                 ontouchdrawer(recyclerview.getchildlayoutposition(child));                 return true;             }             return false;         }          @override         public void ontouchevent(recyclerview rv, motionevent e) {          }          @override         public void onrequestdisallowintercepttouchevent(boolean disallowintercept) {          }     }); }  private void additemstodatalist() {     datalist.add(new draweritem(getstring(r.string.title_profile), r.mipmap.ic_action_profile));     datalist.add(new draweritem(getstring(r.string.title_prizes), r.mipmap.ic_action_prizes));     datalist.add(new draweritem(getstring(r.string.title_sales), r.mipmap.ic_action_sales));     datalist.add(new draweritem(getstring(r.string.title_about),r.mipmap.ic_action_about)); }  public void openfragment(final fragment fragment) {     int backstackentrycount = getsupportfragmentmanager()                                       .getbackstackentrycount();     if (!fragment.tostring().equalsignorecase(currentfragmentname)) {         switchcontent(fragment);     }     getsupportfragmentmanager()            .begintransaction()            .replace(r.id.container, fragment)            .commit(); }  private void ontouchdrawer(final int position) {     currentfragment = position;     switch (position) {         case profile_fragment:             openfragment(new profilefragment());             settitle(getstring(r.string.title_profile));             break;         case prizes_fragment:             openfragment(new prizesfragment());             settitle(getstring(r.string.title_prizes));             break;         case sales_fragment:             openfragment(new salesfragment());             settitle(getstring(r.string.title_sales));             break;         case about:             openfragment(new aboutfragment());             settitle(getstring(r.string.title_about));             break;         default:     } }  public void switchcontent(fragment fragment) {     getsupportfragmentmanager().begintransaction()             .replace(r.id.container, fragment)             .addtobackstack(fragment.getclass().getsimplename())             .commit(); } 

}

the fragment class:

public class salefragment extends templatefragment {  collapsingtoolbarlayout collapsingtoolbar; viewpager viewpager; tablayout tablayout; viewpagertabadaper adapter;  public saledetailfragment() {     // required empty public constructor }  @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {     view result = inflater.inflate(r.layout.fragment_sale_detail, container, false);     viewpager pager = (viewpager) result.findviewbyid(r.id.tabanim_viewpager);     setupviewpager(pager);     return (result); }  @override public void onviewcreated(view view, @nullable bundle savedinstancestate) {     super.onviewcreated(view, savedinstancestate);      final toolbar toolbar = (toolbar) view.findviewbyid(r.id.anim_toolbar);     getmainactivity().setsupportactionbar(toolbar);     getmainactivity().getsupportactionbar().setdisplayhomeasupenabled(true);      collapsingtoolbar = (collapsingtoolbarlayout) view.findviewbyid(r.id.collapsing_toolbar);     collapsingtoolbar.settitle("sale detail");      imageview header = (imageview) view.findviewbyid(r.id.header);     picasso.with(getactivity().getapplicationcontext()).load(r.drawable.details_header).fit().into(header);      viewpager = (viewpager) view.findviewbyid(r.id.tabanim_viewpager);     tablayout = (tablayout) view.findviewbyid(r.id.tabanim_tabs); }  @override public void onactivitycreated(@nullable bundle savedinstancestate) {     super.onactivitycreated(savedinstancestate);      list<string> listdata = new arraylist<>();     int ct = 0;     (int = 0; < versionmodel.data.length * 2; i++) {         listdata.add(versionmodel.data[ct]);         ct++;         if (ct == versionmodel.data.length) {             ct = 0;         }     }     setupviewpager(viewpager);     tablayout.setupwithviewpager(viewpager);     tablayout.setontabselectedlistener(new tablayout.ontabselectedlistener() {         @override         public void ontabselected(tablayout.tab tab) {              viewpager.setcurrentitem(tab.getposition());              switch (tab.getposition()) {                 case 0:                     toast.maketext(getactivity(), "sales", toast.length_short).show();                     break;                 case 1:                     toast.maketext(getactivity(), "store description", toast.length_short).show();                     break;             }         }          @override         public void ontabunselected(tablayout.tab tab) {          }          @override         public void ontabreselected(tablayout.tab tab) {          }     }); }  private void setupviewpager(viewpager viewpager) {     adapter = new viewpagertabadaper(getactivity().getsupportfragmentmanager());     adapter.addfrag(new dummyfragment(getresources().getcolor(r.color.accent_material_light)), "sales");     adapter.addfrag(new dummyfragment(getresources().getcolor(r.color.ripple_material_light)), "store description");     viewpager.setadapter(adapter); }  public static class dummyfragment extends android.support.v4.app.fragment {     int color;     simplerecycleradapter adapter;      public dummyfragment() {     }       @suppresslint("validfragment")     public dummyfragment(int color) {         this.color = color;     }      @override     public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {         view view = inflater.inflate(r.layout.tabs_fragment, container, false);          final framelayout framelayout = (framelayout) view.findviewbyid(r.id.dummyfrag_bg);         framelayout.setbackgroundcolor(color);          recyclerview recyclerview = (recyclerview) view.findviewbyid(r.id.dummyfrag_scrollableview);          linearlayoutmanager linearlayoutmanager = new linearlayoutmanager(getactivity().getbasecontext());         recyclerview.setlayoutmanager(linearlayoutmanager);         recyclerview.sethasfixedsize(true);          list<string> list = new arraylist<>();         (int = 0; < versionmodel.data.length; i++) {             list.add(versionmodel.data[i]);         }          adapter = new simplerecycleradapter(list);         recyclerview.setadapter(adapter);          return view;     } } 

}

the view pager tab adaper:

public class viewpagertabadaper extends fragmentpageradapter { private final list<fragment> mfragmentlist = new arraylist<>(); private final list<string> mfragmenttitlelist = new arraylist<>();  public viewpagertabadaper(fragmentmanager manager) {     super(manager); }  @override public android.support.v4.app.fragment getitem(int position) {     return mfragmentlist.get(position); }  @override public int getcount() {     return mfragmentlist.size(); }  public void addfrag(android.support.v4.app.fragment fragment, string title) {     mfragmentlist.add(fragment);     mfragmenttitlelist.add(title); }  @override public charsequence getpagetitle(int position) {     return mfragmenttitlelist.get(position); } 

}

my objective layout looks -- this--

so collapsing toolbar collapses when scrolled , fragment title toolbar , tabs visible , return when scrolled down. i've tried many solutions, either pin tabs bottom or not work collapsing toolbars in general, not option here.

appreciate suggestions , thanks.

i able solve following example posted here. main issues app:layout_collapsemode="parallax" attribute made image fill entire space , cover elements in , found out appbarlayout extends linearlayout accepts atribute android:layout_gravity="bottom" on tablayout , forcing bottom. added elements needed final layout below:

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.coordinatorlayout     android:id="@+id/main_content"     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     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="300dp"         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"             app:layout_scrollflags="scroll|exituntilcollapsed">              <imageview                 android:id="@+id/header"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:layout_marginbottom="?attr/actionbarsize"                 android:background="@drawable/details_header"/>               <linearlayout                 android:id="@+id/smth"                 android:layout_width="match_parent"                 android:layout_height="wrap_content"                 android:layout_gravity="bottom"                 android:layout_marginbottom="?attr/actionbarsize"                 android:background="#f8f5ee"                 android:orientation="vertical">                   <textview                     android:id="@+id/text_store_page_name"                     android:layout_width="wrap_content"                     android:layout_height="wrap_content"                     android:layout_marginstart="18dp"                     android:layout_margintop="35dp"                     android:text="leitaria quinta paÇo"                     android:textcolor="#000000"                     android:textsize="20sp"                     android:textstyle="bold"/>                  <textview                     android:id="@+id/textview14"                     android:layout_width="wrap_content"                     android:layout_height="wrap_content"                     android:layout_marginstart="13dp"                     android:layout_margintop="3dp"                     android:drawableleft="@mipmap/ic_action_profile"                     android:text="pastelaria caseira"                     android:textappearance="?android:attr/textappearancemedium"                     android:textcolor="#000000"/>             </linearlayout>              <android.support.design.widget.floatingactionbutton                 android:id="@+id/fab"                 android:layout_width="45dp"                 android:layout_height="45dp"                 android:layout_gravity="right"                 android:layout_margintop="115dp"                 android:elevation="0dp"                 android:src="@mipmap/ic_action_share"/>              <android.support.design.widget.floatingactionbutton                 android:id="@+id/fab_location"                 android:layout_width="45dp"                 android:layout_height="45dp"                 android:layout_gravity="right"                 android:layout_marginend="68dp"                 android:layout_margintop="115dp"                 android:elevation="0dp"                 android:src="@mipmap/ic_action_location"/>              <android.support.design.widget.floatingactionbutton                 android:id="@+id/fab_share"                 android:layout_width="45dp"                 android:layout_height="45dp"                 android:layout_gravity="right"                 android:layout_marginend="130dp"                 android:layout_margintop="115dp"                 android:elevation="0dp"                 android:src="@mipmap/ic_action_share"/>              <de.hdodenhof.circleimageview.circleimageview                 android:id="@+id/prize_icon"                 android:layout_width="70dp"                 android:layout_height="70dp"                 android:layout_marginstart="16dp"                 android:layout_margintop="115dp"                 android:src="@drawable/eclair"/>               <android.support.v7.widget.toolbar                 android:id="@+id/anim_toolbar"                 android:layout_width="match_parent"                 android:layout_height="?attr/actionbarsize"                 android:background="@color/transparent"                 app:layout_collapsemode="parallax"                 app:layout_scrollflags="scroll|enteralways"                 app:popuptheme="@style/themeoverlay.appcompat.light"/>               <android.support.design.widget.tablayout                 android:id="@+id/tabanim_tabs"                 android:layout_width="match_parent"                 android:layout_height="?attr/actionbarsize"                 android:layout_gravity="bottom"                 android:gravity="center"                 app:tabgravity="center"                 app:tabindicatorcolor="#f1514a"                 app:tabmode="scrollable"                 app:tabselectedtextcolor="@android:color/white"                 app:tabtextcolor="#99ffffff"/>          </android.support.design.widget.collapsingtoolbarlayout>     </android.support.design.widget.appbarlayout>      <android.support.v4.view.viewpager         android:id="@+id/tabanim_viewpager"         android:layout_width="match_parent"         android:layout_height="match_parent"         app:layout_behavior="@string/appbar_scrolling_view_behavior"/>   </android.support.design.widget.coordinatorlayout> 

and @skynet helpful references.


Comments