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.
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()
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();
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
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.
Ich hatte das gleiche problem Als ich .dismiss () verwendete, sahen die Animationen anders aus und es gab zwei Probleme:
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
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)