2015-06-09 12 views
53

Biblioteka wsparcia projektowania Android obsługuje teraz pasek Snackbar.Jak zamknąć pasek nawigacyjny za pomocą własnego przycisku akcji?

Użyłem poniższy kod, żeby utworzyć:

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

      } 
     }).show(); 

bistrem może zostać odwołany przez machnięcia. Jednak chcę go także usunąć za pomocą własnego przycisku akcji (utworzonego za pomocą funkcji setAction).

Jednak nie wydaje się, aby dostępna była jakakolwiek dostępna funkcja.

+4

jako notatkę, aby ludzie, którzy przychodzą tutaj , wykonanie akcji "Odrzuć" na pasku "Snackbar" jest niezgodne z [Wytycznymi dotyczącymi projektowania materiałów Google] (https://material.google.com/components/snackbars-toasts.html#snackbars-toasts-usage). – Loyalar

Odpowiedz

86

Metoda .make zwraca obiekt Snackbar. Zapisz instancję tego obiektu, wykonując ją jako final. Następnie w onClick(), zadzwoń .dismiss:

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

snackBar.setAction("Dismiss", new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     snackBar.dismiss(); 
    } 
}); 
snackBar.show(); 
+2

, jeśli zrobię to w układzie koordynatora za pomocą elementu FloatingActionButton, przycisk FloatingActionButton nie zostanie wyłączony. –

+32

Pasek nawigacyjny jest domyślnie odrzucany po kliknięciu akcji. Jawne wywoływanie metody odrzucania jest niepotrzebne. –

+8

@MarkBuikema ta funkcja została dodana później. W czasie pytania, które nie było niesmacznym zachowaniem snackbaru. – EE66

36

Wdrożenie działań kliknij i niech pusty. Kliknięcie na czynność z pustym kliknięciem spowoduje odrzucenie paska adresu.

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

Miałem ten sam problem. Kiedy użyłem .dismiss() animacje wyglądała inaczej i były dwa problemy:

  1. FAB nie zejść ponownie
  2. sama bistrem nie zjechać w dół jak to będzie na Click

Patrząc na oryginalny kod źródłowy dla Android 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 Android kod źródłowy Snackbar: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java

+0

Nie ma dla mnie żadnego sensu. Dlaczego warto wywołać metodę performClick(), jeśli faktycznie klikniesz przycisk? To wydaje się nonsensem. –

1

Snackbar (od 'com.android.support:design:23.2.1') obsługują wiele rodzajów oddalenie skargi. Można utworzyć prosty filtr za pomocą zdarzenie, takich jak w poniższym 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(); 

bistrem za odrzucisz typy:

/** 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 użyte wyrażeń lambda (przez RetroLambda)

+0

Pytanie nie dotyczy usługi obsługi zwolnień. Pytanie brzmi, jak zamknąć przy kliknięciu przycisku. –

5

Kiedy używasz Snackbar.LENGTH_LONG, nie potrzebujesz przycisku akcji, aby zwolnić, po drugim automatycznym odrzuceniu. Należy 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(); 

być ostrożnym ta linia:

Snackbar.LENGTH_INDEFINITE 
3

To stara sprawa, ale ja po prostu chcesz podzielić się własnym doświadczeniem wokół podobną funkcję na Snackbar.Dostaliśmy więc projekt naszej aplikacji, że snackbar powinien być wyświetlany w nieskończoność, a użytkownik powinien mieć możliwość jego odrzucenia .. ale nie powinno być w nim przycisku WYPŁATA (Google nie poleca Odrzucania ani Anulowania działań w snackbary). Nasz snackbar musiał zostać odrzucony po prostu dotykając go.

Jedynym rozwiązaniem, pracuje dla nas, był w końcu (używam retrolambda tutaj, ale norma View.OnClickListener może być stosowany również):

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

uwaga getView() rozmowy środkowa;) Mam nadzieję, że to może pomóc komuś, kiedyś :)

poważaniem

Darek

+0

Gdzie czytasz, że "Google nie poleca Odrzucić lub anulować działania w Snackbars"? Chciałbym przeczytać powód .... – JoseF

+0

@JoseF Proszę sprawdzić pierwszy komentarz pod samym pytaniem;) Jest w wytycznych Material Design: https://material.io/guidelines/components/snackbars-toasts.html#snackbars -toasts-usage ("0-1 działań, nie odwołaj ani anuluj") –

Powiązane problemy