43

Sto utilizzando uno snack dalla libreria com.android.support:design:22.2.0. Lo sto usando per annullare le eliminazioni. Per semplificarmi la vita, farò apparire l'interfaccia utente come se fossero effettivamente cancellate dall'origine dati, e se il pulsante di annullamento nella barra degli snack non viene premuto, eseguiremo effettivamente le eliminazioni dall'origine dati. Quindi, voglio sapere quando lo Snackbar non è più visibile, quindi è sicuro cancellare gli oggetti.Come posso essere avvisato quando una Snackbar si è autoproclamata?

Posso chiamare getView() sullo Snackbar, ma non sono sicuro di quale ascoltatore dovrei utilizzare. Ho provato setOnSystemUiVisibilityChangeListener() ma quello non ha funzionato, credo che sia solo per la barra di stato del sistema.

Inoltre, Snackbar non può essere esteso, in quanto ha un costruttore privato.

+1

Questa funzione sarà nella prossima versione della libreria di disegno supporto –

risposta

89

La libreria di progettazione di Google supporta i richiami di Snackbar nella versione 23. Vedere Snackbar docs e Callback docs. Sarà quindi essere avvisato quando lo Snackbar viene respinto (ed anche quando mostrato) e anche il tipo di licenziamento se questo è utile per voi:

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) { 
     ... 
    } 
    }); 
+6

setCallback() è ora deprecato. Usa addCallback() invece – jds17

1

Attualmente non è possibile raggiungerlo.

Non c'è un listener chiamato quando lo snackbar è dimissato.

Il modo più semplice per farlo è quello di salvare temporaneamente il record altrove (anche una variabile locale), quindi reinserirlo se si verifica il pulsante Annulla.

3

Attualmente non è possibile ricevere notifiche quando lo Snackbar ha terminato la visualizzazione.

In questa discussione viene discussa una soluzione in base a un timer per la durata della visualizzazione Snackbar. Snackbar in Support Library doesn't include OnDismissListener()?

Un problema da considerare con questa soluzione è che è possibile riavviare la durata di Snackbar. Il material design specification for Snackbar dice che questo accadrà se viene visualizzata una finestra di dialogo o un popup non collegati.

13

Recentemente mi sono imbattuto in questa questione io stesso quando per scorrere e mostrare Snackback, troppi sono stati mostrati prima che il primo scomparisse. Dovevo trovare un modo per sapere se l'app avrebbe dovuto posare lo Snackbar.

Ho trovato personalmente questa soluzione.

È vero che Snackbar in sé non offre alcun tipo di listener per il suo stato/visibilità, ma è comunque possibile ottenere l'oggetto Visualizza fuori da Snackbar (getView();). Dall'oggetto View hai la possibilità di utilizzare un'ampia varietà di metodi per aggiungere listener.

Per implementarlo è necessario uscire dall'uso comune "All-in-one" di Toast/Snackbar, perché l'aggiunta di listener restituisce vuoto.

Personalmente ho trovato OnAttachStateChangeListener per soddisfare le mie esigenze.

Eliminare un snipper con il mio codice nel caso in cui potrebbe tornare utile per voi.

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(); 

Si prega di notare che questa è solo la mia implementazione per il mio problema, Handler con un postDelayed Runnable potrebbe anche non adatta al vostro caso. Era solo per dare un'idea generale dell'implementazione che ho suggerito utilizzando uno snippet che già possiedo.

+0

Questo è andswer la risposta corretta –

+4

di and_dev è la risposta meglio ora. –

11

Per ricevere una notifica quando uno snack bar è stato mostrato o ignorato, è possibile fornire uno Snackbar.Callback tramite setCallback (Callback).

+0

Questa dovrebbe essere la risposta corretta ora. –

+0

setCallBack è deprecato ora, utilizzare addCallBack invece – mjn42

12
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) { 
      ... 
     } 
    }); 
+0

menzionando l'evento, perché onDismissed viene anche chiamato quando viene cliccato actionText –

1

onDismissed è chiamata anche quando l'azione di testo viene cliccato per questo motivo hanno bisogno di mettere una condizione come

event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT 

E ora il nuovo codice è simile al seguente.

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(); 
+0

Le uniche risposte del codice non sono incoraggiate in quanto non forniscono molte informazioni per i futuri lettori, per favore fornisci qualche spiegazione a ciò che hai scritto – WhatsThePoint