2017-08-16 2 views
1

Ich habe einen Schalter zwischen zwei Staaten, die beim Klicken zeigt eine Snackbar mit dem aktuellen Zustand. Wenn ein Benutzer den Status schnell zurück schaltet, werden möglicherweise eine Vielzahl von Imbissbuden in die Warteschlange gestellt, die nacheinander auftauchen, wobei jeder der Zustände angezeigt wird, während der andere aktiv sein kann. Dies könnte den Benutzer verwirren, also dachte ich mir, ich würde die Snackbar des anderen Staates bei der Erstellung eines neuen ignorieren.Detect Snackbar entlassen werden (nicht onDimissed)

Um dies zu erreichen, rufe ich die alte Snackbar dismiss() Methode. Es gibt ein Problem damit: Wenn ich den Zustand umschalte, dh wenn ich die alte Snackbar, während die alte Snackbar bereits in ihrer Entlassungsanimation war, zwingt die Aufforderung die Animation neu zu starten, wodurch ein grafischer Fehler entsteht (der fast entlassene alte Snackbar wird zurückgewiesen). Beachten Sie, dass die Ablehnungsanimation der alten Snackbar von mir selbst ausgelöst werden kann (dismiss()) oder vom System (nach Timeout).

Eine Lösung wäre es, zu erkennen, dass eine Snackbar gerade entlassen wird. Es gibt die Snackbar.Callback Klasse onDismissed() Methode, aber diese Methode wird nur nach die Kündigung Animation beendet. Ich möchte die Snackbar vor oder während die Entlassung zu erkennen. Die boolesche Methode isShown() der Klasse BaseTransientBottomBar nützt auch nichts: Die Snackbar wird bis zum Ende der Kündigung angezeigt.

Ich habe auch versucht, die Snackbar View und fügen Sie eine OnLayoutChangeListener, aber das hört nur auf die Schaffung der Snackbar und wird nicht auf Entlassung verwendet.

Wie kann ich eine Snackbar entdecken, die gerade entlassen wird?

Antwort

0

Wenn Sie die snackbar entlassen, könnten Sie die aktuelle Zeit sparen:

long snackbarDismissStartTime = System.currentTimeMillis(); 

Wenn dann die snackbar prüfen zur Zeit entlassen wird, tun:

if (System.currentTimeMillis() < snackbarDismissStartTime + 250) 
{ 
    // snackbar is currently being dismissed 
} 

250 ist die Anzahl der Millisekunden dauert es, bis die Animation der Snackleiste abgeschlossen ist, wie durch die Konstante BaseTransientBottomBarANIMATION_DURATION festgelegt. Natürlich kann nicht garantiert werden, dass sich dieser Wert in Zukunft nicht ändert.

Sie können auch einen Fudge-Faktor von etwa 100ms hinzufügen (genau, was es aus meiner eigenen Erfahrung zu brauchen scheint), wenn Sie absolut sicher sein wollen, dass die Entlassung beendet ist.

+0

Dies wird eine snackbar noch entlassen erkennen, nachdem ich 'entlassen nennen()', das ein Teil des Problems ist. Ein anderes Problem ist eine Kündigung, die vom System nach einer spontanen Zeitüberschreitung ausgelöst wird. In diesem Fall rufe ich nicht 'disney()' auf der alten Snackbar auf, aber das System tut es. Was ist schön, dass ich weiß wann, weil ich die Dauer der Snackbar angeben kann. Mit diesen Informationen könnte Ihre Antwort auf jede Snackbar ausgedehnt werden. Es kann sogar möglich sein, 'disney()' zu überschreiben, um diese Überprüfung einzuschließen, aber ich weiß es nicht genau, da ich es jetzt nicht überprüfen kann. Ich habe das bearbeitet, um das zu klären. – Erik

0

Ich habe eine Bibliothek namens SnackProgressBar geschrieben. Es enthält ein erweitertes Warteschlangensystem, das hilfreich sein kann. Sie können alle gestapelten SnackProgressBar-Warteschlangen über einen einfachen clearAll()-Aufruf löschen, bevor Sie Ihre neue SnackProgressBar anzeigen. Hoffe es löst dein Problem.

https://github.com/tingyik90/snackprogressbar

Verwandte Themen