it-swarm.com.de

Wie kann ich benachrichtigt werden, wenn eine Snackbar sich selbst entlassen hat?

Ich verwende eine Snackbar aus der com.Android.support:design:22.2.0-Bibliothek. Ich verwende es, um Löschungen rückgängig zu machen. Um mein Leben zu vereinfachen, werde ich die Benutzeroberfläche so aussehen lassen, als würden die Dinge tatsächlich aus der Datenquelle gelöscht. Wenn die Rückgängig-Schaltfläche in der Snackleiste nicht gedrückt wird, werden die Löschvorgänge aus der Datenquelle tatsächlich ausgeführt. Ich möchte also wissen, wann die Snackbar nicht mehr sichtbar ist. Das Löschen der Elemente ist also sicher. 

Ich kann getView () in der Snackbar aufrufen, bin aber nicht sicher, welchen Listener ich verwenden sollte. Ich habe setOnSystemUiVisibilityChangeListener() ausprobiert, aber das hat nicht funktioniert. Ich glaube, es ist nur für die Statusleiste des Systems. 

Außerdem kann die Snackbar nicht erweitert werden, da sie über einen privaten Konstruktor verfügt. 

51
Tyler Pfaff

Die Google Design Library unterstützt Snackbar-Rückrufe in Version 23. Siehe Snackbar-Dokumente und Rückruf-Dokumente . Sie werden dann benachrichtigt, wenn die Snackbar gekündigt wird (und auch angezeigt wird) und auch die Art der Kündigung, falls dies für Sie nützlich ist: 

snackbar.addCallback(new Snackbar.Callback() {

    @Override
    public void onDismissed(Snackbar snackbar, int event) {
      //see Snackbar.Callback docs for event details
      ...  
    }

    @Override
    public void onShown(Snackbar snackbar) {
       ...
    }
  });
126
and_dev
    snackbar.setCallback(new Snackbar.Callback() {

        @Override
        public void onDismissed(Snackbar snackbar, int event) {
            if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
                // Snackbar closed on its own
            }
        }

        @Override
        public void onShown(Snackbar snackbar) {
            ...
        }
    });
20
Ananth

Vor kurzem bin ich selbst über diese Angelegenheit gestolpert, als ich zum Scrollen und Anzeigen von Snackback zu viele gezeigt habe, bevor der erste überhaupt verschwunden war. Ich musste einen Weg finden, um herauszufinden, ob die App die Snackbar hätte ablegen sollen.

Ich habe diese Lösung persönlich gefunden.

Es ist wahr, dass Snackbar selbst keine Art von Listener für Status/Sichtbarkeit bietet, aber Sie können das View Object trotzdem aus Snackbar (getView ();) holen. Über das Ansichtsobjekt haben Sie die Möglichkeit, eine Vielzahl von Methoden zum Hinzufügen von Listenern zu verwenden.

Um dies zu implementieren, müssen Sie die übliche "All-in-One-Line" -Obot-/Snackbar-Verwendung beenden, da das Hinzufügen von Listenern void zurückgibt.

Ich habe persönlich OnAttachStateChangeListener gefunden, um meine Bedürfnisse zu erfüllen. 

Einen Snipper mit meinem Code fallen lassen, falls er für Sie nützlich sein könnte.

Snackbar snack = Snackbar.make(getView(), "My Placeholder Text", Snackbar.LENGTH_LONG);

snack.getView().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
    @Override
        public void onViewAttachedToWindow(View v) {
            canDisplaySnackbar = false;
        }

    @Override
    public void onViewDetachedFromWindow(View v) {

        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            @Override
            public void run() {
                canDisplaySnackbar = true;

                }
        }, 1000);
    }
});
snack.show();

Bitte beachten Sie, dass dies nur meine Implementierung für mein eigenes Problem ist. Handler mit einem postDelayed Runnable passt möglicherweise nicht einmal in Ihren Fall. Ich wollte nur eine allgemeine Vorstellung von der Implementierung geben, die ich vorgeschlagen hatte, ein Snippet zu verwenden, das ich bereits besitze.

13
FrancescoC

Um benachrichtigt zu werden, wenn eine Snackbar angezeigt oder abgewiesen wurde, können Sie eine Snackbar.Callback über setCallback (Callback) einrichten.

11
fab
3
Tyler Pfaff

onDismissed wird auch aufgerufen, wenn auf die Aktion Text geklickt wird, aus diesem Grund muss eine Bedingung wie gesetzt werden 

event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT

Und jetzt sieht der neue Code wie folgt aus.

final Snackbar snackBar = Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG);

snackbar.addCallback(new Snackbar.Callback() {

@Override
public void onDismissed(Snackbar snackbar, int event) {
 if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
        // Snackbar closed on its own
    }  
}

@Override
public void onShown(Snackbar snackbar) {
...
}
});
snackBar.show();
3
Vishal G. Gohel

Es gibt derzeit keine Möglichkeit, eine Benachrichtigung zu erhalten, wenn die Anzeige der Snackbar abgeschlossen ist.

In diesem Thread wird eine Problemumgehung basierend auf einem Timer für die Dauer der Snackbar-Anzeige beschrieben. Die Snackbar in der Support Library enthält keinen OnDismissListener ()?

Bei dieser Problemumgehung ist zu berücksichtigen, dass die Snackbar-Dauer möglicherweise neu gestartet wird. Die Material Design-Spezifikation für Snackbar besagt, dass dies geschieht, wenn ein nicht zusammenhängender Dialog oder ein Popup angezeigt wird.

3
BrentM

Snackbar.addCallback in Kotlin

val snackBar = Snackbar
                .make(view, "Text Snackbar", Snackbar.LENGTH_LONG)
                .addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
                    override fun onShown(transientBottomBar: Snackbar?) {
                        super.onShown(transientBottomBar)
                    }

                    override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
                        super.onDismissed(transientBottomBar, event)
                    }
                })

        val snackBarView = snackBar.view
        snackBarView.setBackgroundColor(Color.RED)
        snackBar.show()
2
Sergey Milakov

Derzeit kann man es nicht erreichen.

Es wird kein Zuhörer gerufen, wenn die Snackbar eingenäht ist.

Am einfachsten können Sie dies tun, indem Sie den Datensatz vorübergehend an anderer Stelle speichern (sogar eine lokale Variable) und ihn dann erneut einfügen, wenn er die Rückgängig-Schaltfläche drückt.

1
    snackbar.addCallback(new Snackbar.Callback() {
        public void onShown(Snackbar snackbar) {
           //  on show  
        }
 public void onDismissed(Snackbar snackbar, int event) {
          //  on dismiss  
        }
      });
0
dileep krishnan