Android FloatingActionButton Hide/Show On Page Change -
i have tabbed layout, using smarttablayout, floatingactionbutton in bottom right corner. when transition page hide floatingactionbutton, make reappear different color , different icon. when call hide() method, change icon, call show() method hide() method hasn't finished it's animation before show() called resulting in floatingactionbutton not reappearing.
why doing this? according material design floating action buttons found here, should follow these 2 rules when dealing tabbed layouts:
- if there floating action button on multiple lateral screens (such on tabs), upon entering each screen, button should show , hide if action contained on each different. if action same, button should stay on screen (and translate new position, if necessary.)
- for tabbed screens, floating action button should not exit screen in same direction screen exits. doing creates visual noise. cause nonfunctional floating action button appear on screen. furthermore, incorrectly implies floating action button @ same z-level content, rather @ level of primary ui elements @ root level.
my first thought have 1 floatingactionbutton , change it's color , behavior whichever page i'm on. works great sans disappearing act. tried adding floatingactionbutton each page fragment, i'm getting undesired result of floatingactionbutton swiping away page (the no-no #2).
so, 1 floatingactionbutton.
one other thing i've tried:
- i've tried putting in async task first calls hide(), changes floatingactionbutton color, waits 250 milliseconds, calls show(). seems hacky, worked when swiping between pages. didn't work when clicking tabs button.
so, if point me in correct direction, appreciated.
current code:
hometabbar bar = new hometabbar(); viewgroup tab = (viewgroup) findviewbyid(r.id.container); tab.addview(layoutinflater.from(this).inflate( r.layout.demo_custom_tab_icons1 , tab, false)); mviewpager = (viewpager) findviewbyid(r.id.viewpager); smarttablayout viewpagertab = (smarttablayout) findviewbyid(r.id.viewpagertab); final viewgroup view = (viewgroup) findviewbyid(android.r.id.content); viewpagertab.setonpagechangelistener(new viewpager.onpagechangelistener() { private int currentpage; @override public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) { } @override public void onpageselected(int position) { currentpage = position; } @override public void onpagescrollstatechanged(int state) { int colorindex = color.red; mfab.hide(); switch (currentpage) { case 0: colorindex = color.red; mfab.setimagedrawable(getresources().getdrawable(r.drawable.plus_sign)); mfab.show(); break; case 2: colorindex = color.argb(255, 76, 175, 80); mfab.setimagedrawable(getresources().getdrawable(r.drawable.ic_add_bowling_ball_white_24dp)); mfab.show(); break; case 3: colorindex = color.blue; mfab.setimagedrawable(getresources().getdrawable(r.drawable.ic_add_location_white_24dp)); mfab.show(); break; default: // leaves fab hidden on other tabs break; } mfab.setbackgroundtintlist(colorstatelist.valueof(colorindex)); } }); bar.setup(viewpagertab); fragmentpageritems pages = new fragmentpageritems(this); (integer title : bar.tabs()) { switch( title ) { case r.string.player_fragment_tag: pages.add(fragmentpageritem.of(getstring(title), playerfragment.class)); break; case r.string.series_fragment_tag: pages.add(fragmentpageritem.of( getstring( title ), seriesfragment.class)); break; case r.string.balls_fragment_tag: pages.add(fragmentpageritem.of( getstring( title ), ballsfragment.class)); break; case r.string.location_fragment_tag: pages.add(fragmentpageritem.of( getstring( title ), bowlingalleyfragment.class)); break; default: break; } } fragmentpageritemadapter adapter = new fragmentpageritemadapter( getsupportfragmentmanager(), pages){ @override public int getitemposition(object object) { return position_none; } }; mviewpager.setadapter(adapter); viewpagertab.setviewpager(mviewpager); mtoolbar = (toolbar) findviewbyid(r.id.toolbar_actionbar); setsupportactionbar(mtoolbar);
i had similar problem. wanted show snackbar, after fab has appeared. solved this:
floatingactionbutton fab = (floatingactionbutton) findviewbyid(r.id.fab); floatingactionbutton.onvisibilitychangedlistener fablistener; fablistener = new floatingactionbutton.onvisibilitychangedlistener(){ @override public void onshown(floatingactionbutton fab) { snackbar.make(fab, "replace own action", snackbar.length_long) .setaction("action", null).show(); super.onshown(fab); } }; fab.show(fablistener);
i think need use fab.hide(fablistener) , the onhidden() method calls fab.show() after changed color.
greetings
Comments
Post a Comment