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
Post a Comment