Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android floating action button show() not working

I have a floating action button (FAB) and an Async Task that calls FAB.hide() before loading some data in background, and FAB.show() after it's done. For some reason, Even though my console log clearly shows a call is always being made to hide() and then show(), sometimes the FAB hides but doesn't show until the task is executed again.

UPDATE

The problem seems to happen if the calls are too close. I actually tried the code:

fab.hide();
fab.show();

and the same problem occurs (fab is not showing). Any ideas for handling this?

like image 811
OmriSoudry Avatar asked Nov 29 '15 09:11

OmriSoudry


2 Answers

UPDATE: As noted on the Issue Tracker, this issue has been fixed as of version 24.2.0 of the support library.


I came across a similar situation. The problem seems to be that the floating action button doesn't consider itself shown or hidden until it's show/hide animation is finished.

So if you call hide(); but then call show(); before the hide animation has finished, then the show animation won't run because the button is still set as being in a shown state already.

I don't know if this is the optimum solution but I solved it as follows:

boolean fabShouldBeShown;
FloatingActionButton.OnVisibilityChangedListener fabListener = new FloatingActionButton.OnVisibilityChangedListener() {
    @Override
    public void onShown(FloatingActionButton fab) {
        super.onShown(fab);
        if(!fabShouldBeShown){
            fab.hide();
        }
    }

    @Override
    public void onHidden(FloatingActionButton fab) {
        super.onHidden(fab);
        if(fabShouldBeShown){
            fab.show();
        }
    }
};

public void methodWhereFabIsHidden() {
    fabShouldBeShown = false;
    myFab.hide(fabListener);
}

public void methodWhereFabIsShown() {
    fabShouldBeShown = true;
    myFab.show(fabListener);
}

By setting our own boolean along with this listener we can deal with these interrupted situations. When we get to the end of the animation we check if we are in the state that we actually want to be, and if not we change to the correct one.

like image 131
Lewis McGeary Avatar answered Nov 14 '22 07:11

Lewis McGeary


Fixed in support library 24.2.0:

https://code.google.com/p/android/issues/detail?id=216469

like image 26
j2esu Avatar answered Nov 14 '22 05:11

j2esu