Biblioteka wsparcia projektowania Androida obejmuje teraz obsługę Snackbar.
Użyłem następującego kodu, aby go utworzyć:
Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG)
.setAction("Dismiss", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}).show();
Pasek z przekąskami można zamknąć jednym machnięciem. Jednak chcę również odrzucić go za pomocą własnego przycisku akcji (utworzonego za pomocą funkcji setAction).
Jednak wydaje się, że nie ma żadnej dostępnej funkcji, która mogłaby to zrobić.
Snackbar
jest niezgodne z wytycznymi Google Material Design .Odpowiedzi:
W przypadku Javy
.make
Sposób powraca doSnackbar
obiektu. Zapisz instancję tego obiektu, tworząc jąfinal
. NastępnieonClick()
zadzwoń.dismiss
: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();
Dla Kotlina,
Snackbar.make( findViewById(android.R.id.content), "Snackbar Message", Snackbar.LENGTH_INDEFINITE ).setAction("Action Message") { // Call action functions here }.show()
źródło
OnClickListener
jestnull
Zaimplementuj akcję kliknięcia i pozostaw ją pustą. Kliknięcie pustego kliknięcia spowoduje zamknięcie paska przekąskowego.
Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG) .setAction("DISMISS", new View.OnClickListener() { @Override public void onClick(View v) { } }) .show();
źródło
null
za słuchacza, nie musisz tworzyć rzeczywistej instancjiKiedy używasz
Snackbar.LENGTH_LONG
, nie potrzebujesz przycisku akcji do zwolnienia, po drugim automatycznie odrzuć. Powinieneś użyć tego kodu: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();
Uważaj na tę linię :
Snackbar.LENGTH_INDEFINITE
źródło
To stare pytanie, ale chcę tylko podzielić się własnym doświadczeniem na temat podobnej funkcji w Snackbar. Mamy więc projekt naszej aplikacji, który powinien być wyświetlany w nieskończoność, a użytkownik powinien mieć możliwość jego odrzucenia… ale w środku nie powinien znajdować się przycisk ODRZUĆ (Google i tak nie zaleca akcji Odrzuć lub Anuluj wewnątrz batonów). Nasz bar z przekąskami musiał zostać usunięty po prostu przez dotknięcie go.
Jedynym rozwiązaniem, które u nas działało, było w końcu (używam tutaj retrolambda, ale można użyć standardowego View.OnClickListener):
final Snackbar snack = ... /* create proper snackbar as alway */ snack.getView().setOnClickListener(v -> snack.dismiss());
Zwróć uwagę na wywołanie getView () w środku.
źródło
Snackbar (z „com.android.support:design:23.2.1” ) obsługuje wiele typów akcji zwolnienia. Możesz utworzyć prosty filtr, używając zdarzenia , takiego jak w tym przykładzie:
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();
Typy zwolnień 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;
PS W przykładowym kodzie wykorzystano wyrażenia lambda (autorstwa RetroLambda)
źródło
Miałem ten sam problem. Kiedy użyłem .dismiss (), animacje wyglądały inaczej i były dwa problemy:
Patrząc na oryginalny kod źródłowy Androida dla Snackbar, znalazłem następujące rozwiązanie:
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
Następnie nazwałbym .performClick na snackBarActionButton
snackBarActionButton.performClick();
Link do kodu źródłowego Androida dla Snackbar: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java
źródło