2016-08-07 1 views
0

Donc mon but est de n'avoir qu'un message toast affiché à l'utilisateur s'il n'y a pas de message toast ou si le message affiché n'est PAS le même que le message que je veux envoyer . Si le message est le même que celui qui est montré à l'utilisateur, je ne veux pas que le message passe (parce que c'est inutile).Montrer le toast seulement s'il est différent du toast existant

Pour travailler vers cet objectif, j'ai trouvé this sur la façon de montrer seulement un toast si aucun n'est montré.

J'ai modifié le code pour répondre aux deux exigences.

private Toast toast; 

public void showAToast (String st, boolean isLong){ 
    try{ 
     toast.getView().isShown(); 
     String text = ((TextView)((LinearLayout)toast.getView()).getChildAt(0)).getText().toString(); 
     if(!text.equalsIgnoreCase(st)){ 
      //New message, show it after 
      if(isLong){ 
       toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_LONG); 
      } else { 
       toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_SHORT); 
      } 
      toast.show(); 
     } 
    } catch (Exception e) { 
     //New message 
     if(isLong){ 
      toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_LONG); 
     } else { 
      toast = Toast.makeText(getApplicationContext(), st, Toast.LENGTH_SHORT); 
     } 
     toast.show(); 
    } 
} 

Mon problème est que tout message ne passera pas par si le dernier message de pain grillé était le même que le message qui veut passer.

Je ne sais pas exactement pourquoi cela se produit, mais j'ai mis quelques messages de débogage dans la méthode pour déterminer quel était le problème.

Les messages indiquent que toast.getView(). IsShown() ne lance pas l'exception (supposons qu'aucun pain grillé ne s'affiche) si un message toast a été envoyé pendant la durée de vie de l'application.

Donc, ma question est, comment puis-je contourner ce problème? Sûrement il doit y avoir un moyen d'atteindre cette fonctionnalité souhaitée.

+0

Pouvez-vous garder une trace de la dernière corde qui a été grillée? Ensuite, vous pouvez simplement faire une simple comparaison de chaînes avec 'equals()'. –

+0

Code-Apprentice Vous avez manqué le point. Le problème n'est pas que les chaînes sont comparées de manière incorrecte, le problème est que la méthode toast.isShown() est en cours d'exécution si le toast a été envoyé à tout moment dans le cycle de vie de l'application. Cela signifie que, même si aucun toast n'est sur l'écran, il traverse tout le code du bloc try au lieu du code du bloc catch (comme c'est supposé le faire). Je demande un moyen de contourner ce problème pour obtenir l'effet désiré. – NuffsaidM8

+0

OIC ... oui, j'ai mal compris la question entièrement, mais pas pour les raisons que vous avez supposé ... mon mauvais. –

Répondre

0

J'ai déjà vu ça dans stackoverflow, mais ce n'est pas aussi propre que je l'aurais souhaité. Nous avons mis en place une double approche toast, où elle alterne entre deux toasts. D'abord, nous définissons les tartines de l'activité avant la OnCreate:

Toast toast0; 
    Toast toast1; 
    private static boolean lastToast0 = true; 
    In the OnCreate: 

    toast0 = new Toast(getApplicationContext()); 
    toast0.cancel(); 
    toast1 = new Toast(getApplicationContext()); 
    toast1.cancel(); 
    //And finally, when I need to display the toast and cancel the prior toast at the same time I use something similar to: 

      if (lastToast0) { 
       toast0.cancel(); 
       toast1.setDuration(Toast.LENGTH_LONG); 
       toast1.setText("new message"); 
       toast1.show(); 
       lastToast0 = false; 
      } else { 
       toast1.cancel(); 
       toast0.setDuration(Toast.LENGTH_LONG); 
       toast0.setText("new message"); 
       toast0.show(); 
       lastToast0 = true; 
      } 
    // If you need to just cancel an existing toast (before it times out) use: 

       toast0.cancel(); 
       toast1.cancel(); 

Citation

0

Vous pouvez utiliser le même Toast exemple pour afficher un message. Si le message est le même, le toast ne sera pas affiché deux fois, sinon le texte passera simplement au dernier.

Toast mToast; 

public void showToast(CharSequence message, int during){ 
    if (mToast == null) { 
     mToast = Toast.makeText(getApplicationContext(), message, during); 
    } else { 
     mToast.setText(message); 
    } 
    mToast.show(); 
} 

- ↓ ↓ --- ---- --- ↓ ↓ update-- ---- ↓ ↓ --- - ↓

Désolé que je manque votre point au-dessus .

J'ai lu la source de Toast que nous ne pouvons pas obtenir le statut de vue depuis que la vue avait été ajoutée au WindownManager.So loin, je ne peux pas trouver une méthode pour indiquer si le Toast est montré.

Mais vous pouvez obtenir votre propre service d'utilisation de Toast, qui aime un toast montré au-dessus de l'application. ça peut être plus facile.

+0

Cela refuserait le même message deux fois de suite, n'est-ce pas? C'est la fonctionnalité que la méthode actuelle a déjà, pas ce que je veux. Je veux qu'un message répété passe, mais pas si le message est déjà visible à l'écran.S'il n'y a pas de message à l'écran, le message doit être envoyé. – NuffsaidM8

+0

Oui, vous avez raison. Après je vais mettre à jour ma réponse. – vcokey