web-dev-qa-db-fra.com

Comment puis-je être averti lorsqu'un Snackbar s'est congédié?

J'utilise un Snackbar de la bibliothèque com.Android.support:design:22.2.0. Je l'utilise pour annuler les suppressions. Pour me simplifier la vie, je vais donner l’impression que l’interface utilisateur a été effacée de la source de données. Si vous n'appuyez pas sur le bouton Annuler de la barre des collations, effectuez les suppressions de la source de données. Donc, je veux savoir quand la barre de coupe ne sera plus visible, alors vous pouvez supprimer les éléments en toute sécurité. 

Je peux appeler getView () sur la barre d'outils, mais je ne sais pas quel auditeur utiliser. J'ai essayé setOnSystemUiVisibilityChangeListener() mais cela n'a pas fonctionné, je pense que c'est uniquement pour la barre d'état du système. 

De plus, Snackbar ne peut pas être étendu, car il possède un constructeur privé. 

51
Tyler Pfaff

La bibliothèque de conception de Google prend en charge les callbacks Snackbar dans la version 23. Voir Documents Snackbar et Documents callback . Vous serez alors averti lorsque le Snackbar sera congédié (et également lorsqu'il sera affiché) ainsi que le type de licenciement si cela vous est utile: 

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) {
       ...
    }
  });
126
and_dev
    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) {
            ...
        }
    });
20
Ananth

Récemment je suis tombé sur cette question moi-même quand pour défiler et montrer Snackback, trop ont été montrés avant même que le premier ait disparu. Je devais trouver un moyen de savoir si l'application aurait dû fixer le Snackbar.

J'ai personnellement trouvé cette solution.

Il est vrai que Snackbar lui-même n’offre aucun type d’auditeur pour son état/visibilité, mais vous pouvez toujours obtenir l’objet View de Snackbar (getView ();). À partir de l'objet de vue, vous avez la possibilité d'utiliser une grande variété de méthodes pour ajouter des écouteurs.

Pour l'implémenter, vous devez sortir de l'utilisation courante de Toast/Snackbar "tout-en-un-ligne", car l'ajout d'écouteurs renvoie void .

J'ai personnellement trouvé OnAttachStateChangeListener pour répondre à mes besoins. 

Lâcher une snipper avec mon code au cas où cela pourrait vous être utile.

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

Veuillez noter que ceci est juste mon implémentation pour mon propre problème, Handler avec un post-Delayed Runnable pourrait même ne pas convenir à votre cas. C'était juste pour donner une idée générale de la mise en œuvre, j'ai suggéré d'utiliser un extrait que je possède déjà.

13
FrancescoC

Pour être averti lorsqu'un snackbar a été affiché ou supprimé, vous pouvez fournir un Snackbar.Callback via setCallback (rappel).

11
fab
3
Tyler Pfaff

onDismissed est également appelé lorsque l'action est cliquée sur le texte pour cette raison. 

event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT

Et maintenant, le nouveau code est comme ci-dessous.

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();
3
Vishal G. Gohel

Il n'y a actuellement aucun moyen d'obtenir une notification lorsque l'affichage de la barre est terminé.

Dans cette discussion, une solution de contournement est décrite en fonction d'un minuteur pour la durée d'affichage de la barre. Snackbar dans Support Library n'inclut pas OnDismissListener ()?

Un problème à prendre en compte avec cette solution de contournement est qu'il est possible que la durée de la barre Snack soit redémarrée. La spécification de conception material pour Snackbar indique que cela se produira si une boîte de dialogue ou une fenêtre contextuelle non liée est affichée.

3
BrentM

Snackbar.addCallback dans Kotlin

val snackBar = Snackbar
                .make(view, "Text Snackbar", Snackbar.LENGTH_LONG)
                .addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
                    override fun onShown(transientBottomBar: Snackbar?) {
                        super.onShown(transientBottomBar)
                    }

                    override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
                        super.onDismissed(transientBottomBar, event)
                    }
                })

        val snackBarView = snackBar.view
        snackBarView.setBackgroundColor(Color.RED)
        snackBar.show()
2
Sergey Milakov

Actuellement, vous ne pouvez pas y arriver.

Il n'y a pas d'auditeur appelé lorsque le snack-bar est dimissed.

La façon la plus simple de le faire est de sauvegarder temporairement l’enregistrement ailleurs (même une variable locale), puis de le réinsérer s’il arrive de cliquer sur le bouton Annuler.

1
Gabriele Mariotti
    snackbar.addCallback(new Snackbar.Callback() {
        public void onShown(Snackbar snackbar) {
           //  on show  
        }
 public void onDismissed(Snackbar snackbar, int event) {
          //  on dismiss  
        }
      });
0
dileep krishnan