2016-01-01 1 views
3

étapesUtilisez SnackBar exemple pour montrer encore et encore

Je suis en mesure d'enregistrer par exemple SnackBar comme ceci:

mSnackBar = Snackbar.make(view, R.string.snack_text, Snackbar.LENGTH_INDEFINITE); 

Et pour la 1er fois qu'elle est montrée assez facilement en utilisant ceci: mSnackBar.show();


Problème

Mais après que je clairement cette collation en utilisant ceci: mSnackBar.dismiss()

Son non montré à nouveau dans LOLLIPOP appareils,
où il est montré à nouveau (si nécessaire en utilisant show()) dans JELLYBEAN émulateur qui est le comportement ATTENDU.


Question

S'il vous plaît me aider à trouver ce qui est faux ou manquant dans ce processus pour LOLLIPOP dispositifs?

+0

donc dans jellybean vous écartez et après cela montre automatiquement à nouveau ou vous faites quelques actions à montrer? – piotrek1543

+0

Oui, j'effectue une action où 'show()' est appelé à nouveau et snack est affiché à nouveau dans les périphériques JB .. ce qui n'est pas vrai dans LOLLIPOP –

Répondre

4

En voyant le code source, je peux voir que le "rejet du snackbar" annulerait le currentSnackBar.

Code source - SnackBar

public void dismiss(Callback callback, int event) { 
    synchronized (mLock) { 
     if (isCurrentSnackbarLocked(callback)) { 
      cancelSnackbarLocked(mCurrentSnackbar, event); 
     } else if (isNextSnackbarLocked(callback)) { 
      cancelSnackbarLocked(mNextSnackbar, event); 
     } 
    } 
} 

/** 
* Should be called when a Snackbar is no longer displayed. This is after any exit 
* animation has finished. 
*/ 
public void onDismissed(Callback callback) { 
    synchronized (mLock) { 
     if (isCurrentSnackbarLocked(callback)) { 
      // If the callback is from a Snackbar currently show, remove it and show a new one 
      mCurrentSnackbar = null; 
      if (mNextSnackbar != null) { 
       showNextSnackbarLocked(); 
      } 
     } 
    } 
} 

Alors, quand vous faites un spectacle sur la même instance ce code se déroulera

public void show(int duration, Callback callback) { 
    synchronized (mLock) { 
     if (isCurrentSnackbarLocked(callback)) { 
      // Means that the callback is already in the queue. We'll just update the duration 
      mCurrentSnackbar.duration = duration; 

      // If this is the Snackbar currently being shown, call re-schedule it's 
      // timeout 
      mHandler.removeCallbacksAndMessages(mCurrentSnackbar); 
      scheduleTimeoutLocked(mCurrentSnackbar); 
      return; 
     } else if (isNextSnackbarLocked(callback)) { 
      // We'll just update the duration 
      mNextSnackbar.duration = duration; 
     } else { 
      // Else, we need to create a new record and queue it 
      mNextSnackbar = new SnackbarRecord(duration, callback); 
     } 

     if (mCurrentSnackbar != null && cancelSnackbarLocked(mCurrentSnackbar, 
       Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE)) { 
      // If we currently have a Snackbar, try and cancel it and wait in line 
      return; 
     } else { 
      // Clear out the current snackbar 
      mCurrentSnackbar = null; 
      // Otherwise, just show it now 
      showNextSnackbarLocked(); 
     } 
    } 
} 

qui ne montrera pas le snack si son null .

Solution

Vous ne devez pas appeler le rejeter SnackBar, il cachera automatique par lui-même lorsque la durée expire ou un bouton d'action est cliqué. Il suffit d'appeler à nouveau la méthode show sans appeler en premier lieu pour afficher à nouveau le SnackBar.

+0

J'ai plongé dans le code et vérifié que cette instruction nullify est appelée si callback est attaché .. Et je n'utilise pas de callback –

+1

Si vous allez regarder dans la méthode show(), vous verrez que le callback est fourni par le framework si vous ne le fournissez pas. – cafebabe1991

+0

Merci c'est la solution correcte et j'ai fait une solution de contournement pour rejeter et montrer à nouveau les SnackBars. Un point à noter, ceci est également applicable lorsque le nouveau snack remplace l'ancien .. et pour API 21+ –