webentwicklung-frage-antwort-db.com.de

Wie kann ich eine Snackbar mit der eigenen Aktionstaste schließen?

Die Android-Design-Supportbibliothek unterstützt jetzt auch die Snackbar.

Ich habe den folgenden Code verwendet, um einen zu erstellen:

Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG)
        .setAction("Dismiss", new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        }).show();

Die Snackbar kann mit einem Schlag geschlossen werden. Ich möchte es jedoch auch mit einem eigenen Aktionsbutton (der mit der Funktion setAction erstellt wurde) schließen.

Es scheint jedoch keine Funktion verfügbar zu sein, die das kann.

76
Asim

Für Java

Die Methode .make Gibt ein Objekt Snackbar zurück. Speichern Sie eine Instanz dieses Objekts, indem Sie es zu final machen. Rufen Sie dann in der onClick().dismiss Auf:

final Snackbar snackBar = Snackbar.make(findViewById(Android.R.id.content), "Snackbar Message", Snackbar.LENGTH_LONG);

        snackBar.setAction("Action Message", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Call your action method here
                snackBar.dismiss();
            }
        });
        snackBar.show();

Für Kotlin

        Snackbar.make(
            findViewById(Android.R.id.content),
            "Snackbar Message",
            Snackbar.LENGTH_INDEFINITE
        ).setAction("Action Message") {
            // Call action functions here
        }.show()
128
EE66

Implementieren Sie eine Klickaktion und lassen Sie sie leer. Wenn Sie auf "Leere Klickaktion" klicken, wird die Snackbar geschlossen.

Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG)
    .setAction("DISMISS", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        }
    })
    .show();
48
Ali Zarei

Wenn Sie Snackbar.LENGTH_LONG Sie brauchen keine Aktionstaste zum Entlassen, nach dem zweiten automatisch entlassen. Sie sollten diesen Code verwenden:

 Snackbar snackbar = Snackbar.make(relativeLayout, "Your Message", Snackbar.LENGTH_INDEFINITE);
            snackbar.setAction("dismiss", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    snackbar.dismiss();
                }
            });

            snackbar.show();

Vorsicht in dieser Zeile:

Snackbar.LENGTH_INDEFINITE
10
hamed golbahar

Dies ist eine alte Frage, aber ich möchte nur meine eigenen Erfahrungen mit ähnlichen Funktionen in der Snackbar teilen. Daher haben wir ein Design für unsere App entwickelt, dass die Snackbar auf unbestimmte Zeit angezeigt wird und der Benutzer sie schließen kann. Es sollte jedoch keine ENTFERNEN-Schaltfläche enthalten sein (Google empfiehlt ohnehin nicht, Aktionen in Snackbars zu verwerfen oder abzubrechen). Unsere Snackbar musste einfach durch Antippen entlassen werden.

Die einzige Lösung, die für uns funktioniert hat, war am Ende (ich verwende hier retrolambda, aber es kann auch der Standard View.OnClickListener verwendet werden):

final Snackbar snack = ... /* create proper snackbar as alway */
snack.getView().setOnClickListener(v -> snack.dismiss());

Hinweis getView () Aufruf in der Mitte.

5

Ich hatte das gleiche problem Als ich .dismiss () verwendete, sahen die Animationen anders aus und es gab zwei Probleme:

  1. FAB geht nicht wieder runter
  2. die SnackBar selbst rutscht nicht wie bei einem Klick nach unten

Als ich den ursprünglichen Android Source Code für Snackbar betrachtete, fand ich die folgende Lösung:

View snackbarView = snackbar.getView();
Button snackbarActionButton = (Button) snackbarView.findViewById(Android.support.design.R.id.snackbar_action);
//snackbarActionButton.setSoundEffectsEnabled(false); // might be considered in order not to have a confusing sound because nothing was clicked by the user

Dann würde ich die .performClick auf den snackBarActionButton aufrufen

snackBarActionButton.performClick();

Link zum Android Quellcode für die Snackbar: https://Android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/ Android/support/design/widget/Snackbar.Java

2

Snackbar (von 'com.Android.support:design:23.2.1') unterstützt viele Arten von Entlassungsaktionen. Sie können mit event einen einfachen Filter erstellen, wie in diesem Beispiel:

Snackbar.make(view, wornMessage, Snackbar.LENGTH_LONG).setActionTextColor(context.getResources().getColor(R.color.primary))
    .setCallback(new Snackbar.Callback() {
        @Override
        public void onShown(Snackbar snackbar) {
            super.onShown(snackbar);
        // when snackbar is showing
        }

        @Override
        public void onDismissed(Snackbar snackbar, int event) {
            super.onDismissed(snackbar, event);
            if (event != DISMISS_EVENT_ACTION) {
               //will be true if user not click on Action button (for example: manual dismiss, dismiss by swipe
            }
        }
    })
    .setAction("Undo, view1 -> {
        // if user click on Action button
}).show();

Entlassungstypen der Snackbar:

/** Indicates that the Snackbar was dismissed via a swipe.*/
public static final int DISMISS_EVENT_SWIPE = 0;
/** Indicates that the Snackbar was dismissed via an action click.*/
public static final int DISMISS_EVENT_ACTION = 1;
/** Indicates that the Snackbar was dismissed via a timeout.*/
public static final int DISMISS_EVENT_TIMEOUT = 2;
/** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/
public static final int DISMISS_EVENT_MANUAL = 3;
/** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/
public static final int DISMISS_EVENT_CONSECUTIVE = 4;

P.S. Im Beispielcode verwendete Lambda-Ausdrücke (von RetroLambda)

1
a.black13