2015-11-29 2 views
6

Ich habe eine Floating-Aktion (FAB) und eine Async-Task, die FAB.hide() vor dem Laden einiger Daten im Hintergrund und FAB.show(), nachdem es fertig ist. Aus irgendeinem Grund, obwohl mein Konsolenprotokoll deutlich zeigt, dass immer ein Aufruf gemacht wird, um zu verstecken() und dann show(), verbirgt sich manchmal das FAB, aber es wird nicht angezeigt, bis die Aufgabe erneut ausgeführt wird.android floating action button show() funktioniert nicht

UPDATE

Das Problem scheint, wenn die Anrufe zu nahe zu kommen. Ich probierte tatsächlich den Code:

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

und das gleiche Problem auftritt (Fab zeigt nicht). Irgendwelche Ideen für den Umgang damit?

Antwort

11

UPDATE: Wie noted on the Issue Tracker, dieses Problem wurde ab Version 24.2.0 der Support-Bibliothek behoben.


Ich stieß auf eine ähnliche Situation. Das Problem scheint darin zu bestehen, dass sich die Floating-Action-Schaltfläche nicht als ein- oder ausgeblendet darstellt, bis die Animation zum Ein-/Ausblenden fertig ist.

Wenn Sie also hide(); anrufen, aber dann show(); anrufen, bevor die ausgeblendete Animation beendet ist, wird die Show-Animation nicht ausgeführt, da die Schaltfläche immer noch so eingestellt ist, dass sie sich bereits in einem gezeigten Zustand befindet.

Ich weiß nicht, ob dies die optimale Lösung ist, aber ich gelöst es wie folgt:

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); 
} 

Durch unsere eigenen boolean Einstellung zusammen mit diesem Hörer wir mit diesen unterbrochen Situationen umgehen können. Wenn wir das Ende der Animation erreichen, prüfen wir, ob wir in dem Zustand sind, in dem wir eigentlich sein wollen, und wenn nicht, wechseln wir zum richtigen.