web-dev-qa-db-fra.com

Comment puis-je montrer un toast pour une durée spécifique?

C’est ainsi que je dois afficher la Toast pendant 500 millisecondes. Bien que, cela montre plus d'une seconde.

Toast.makeText(LiveChat.this, "Typing", 500).show(); 

Comment puis-je afficher Toast uniquement pendant 500 millisecondes?

20
MuraliGanesan

Cela ne peut pas être fait. Pour afficher un pain grillé d'une longueur inférieure à Toast.LENGTH_SHORT, vous devez l'annuler après l'heure souhaitée. Quelque chose comme:

final Toast toast = Toast.makeText(getApplicationContext(), "This message will disappear in half a second", Toast.LENGTH_SHORT);
    toast.show();

    Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
           @Override
           public void run() {
               toast.cancel(); 
           }
    }, 500);
64
Raghav Sood

En ajoutant à la réponse de @ Senth, si vous ne voulez pas accumuler l'heure lorsque vous appelez la méthode showToast plusieurs fois, avec le même message:

private Toast mToastToShow = null;
String messageBeingDisplayed = "";

/**
 * Show Toast message for a specific duration, does not show again if the message is same
 *
 * @param message     The Message to display in toast
 * @param timeInMSecs Time in ms to show the toast
 */
public void showToast(String message, int timeInMSecs) {
    if (mToastToShow != null && message == messageBeingDisplayed) {
        Log.d("DEBUG", "Not Showing another Toast, Already Displaying");
        return;
    } else {
        Log.d("DEBUG", "Displaying Toast");
    }
    messageBeingDisplayed = message;
    // Set the toast and duration
    int toastDurationInMilliSeconds = timeInMSecs;
    mToastToShow = Toast.makeText(this, message, Toast.LENGTH_LONG);

    // Set the countdown to display the toast
    CountDownTimer toastCountDown;
    toastCountDown = new CountDownTimer(toastDurationInMilliSeconds, timeInMSecs /*Tick duration*/) {
        public void onTick(long millisUntilFinished) {
            if (mToastToShow != null) {
                mToastToShow.show();
            }
        }

        public void onFinish() {
            if (mToastToShow != null) {
                mToastToShow.cancel();
            }
            // Making the Toast null again
            mToastToShow = null;
            // Emptying the message to compare if its the same message being displayed or not
            messageBeingDisplayed = "";
        }
    };

    // Show the toast and starts the countdown
    mToastToShow.show();
    toastCountDown.start();
}

Vous pouvez afficher toast maintenant pendant 500 ms comme ceci:

showToast("Not Allowed", 500);
3
shabby

J'ai trouvé cette réponse . Un peu plus complexe, il vous permet également de créer des toasts plus longs que Toast.LENGTH_LONG. Vous devrez peut-être modifier la durée du tick de 1000 ms à 500 ms.

private Toast mToastToShow;
public void showToast(View view) {
   // Set the toast and duration
   int toastDurationInMilliSeconds = 10000;
   mToastToShow = Toast.makeText(this, "Hello world, I am a toast.", Toast.LENGTH_LONG);

   // Set the countdown to display the toast
   CountDownTimer toastCountDown;
   toastCountDown = new CountDownTimer(toastDurationInMilliSeconds, 1000 /*Tick duration*/) {
      public void onTick(long millisUntilFinished) {
         mToastToShow.show();
      }
      public void onFinish() {
         mToastToShow.cancel();
         }
   };

   // Show the toast and starts the countdown
   mToastToShow.show();
   toastCountDown.start();
}

Voici comment cela fonctionne: le compte à rebours a une heure de notification plus courte que la durée d'affichage du pain grillé en fonction de l'indicateur, ce qui permet d'afficher à nouveau le pain grillé si le compte à rebours n'est pas terminé. Si le pain grillé est à nouveau affiché alors qu'il est encore à l'écran, il y restera toute la durée sans clignoter. Lorsque le compte à rebours est terminé, le pain est annulé pour le masquer même si sa durée d’affichage n’est pas terminée.

Cela fonctionne même si le pain grillé doit être affiché pendant une durée inférieure à la durée par défaut: le premier pain grillé affiché sera simplement annulé à la fin du compte à rebours.

2
Senth

Celui-ci fonctionne bien pour moi.

final Toast mToastToShow;
            int toastDurationInMilliSeconds = 10000;
            mToastToShow =  Toast.makeText(getApplicationContext(), "Snapshot Saved Successfully.",Toast.LENGTH_LONG);


            // Set the countdown to display the toast
            CountDownTimer toastCountDown;
            toastCountDown = new CountDownTimer(toastDurationInMilliSeconds, 1000 /*Tick duration*/) {
                public void onTick(long millisUntilFinished) {
                    mToastToShow.show();
                }
                public void onFinish() {
                    mToastToShow.cancel();
                }
            };

            // Show the toast and starts the countdown
            mToastToShow.show();
            toastCountDown.start();

le compte à rebours est utilisé pour afficher un message de pain grillé pendant une durée spécifique.

1
Liya

Vous ne pouvez pas faire ce que vous demandez avec les toasts standard. Peut-être devriez-vous penser à intégrer une bibliothèque tierce qui vous offre de meilleures options pour Toast (nommée Crouton). Je ne l'ai pas utilisé moi-même, mais les gens semblent l'aimer.

Vous ne pouvez pas contrôler la longueur des toasts dans le système d'exploitation standard.

Lien Crouton: https://github.com/keyboardsurfer/Crouton

1
Booger

Cela ne peut pas être fait. Les valeurs de Toast.LENGTH_SHORT et Toast.LENGTH_LONG sont 0 et 1. Cela signifie qu'elles sont traitées comme des indicateurs plutôt que comme des durées réelles. Par conséquent, je ne pense pas qu'il soit possible de définir la durée sur autre chose que ces valeurs.

1
Rob Avery IV

J'ai essayé différentes méthodes et cette méthode fonctionne pour moi 

 final Toast mytoast = Toast.makeText(getApplicationContext(), jsonObject.getString("response_message"), Toast.LENGTH_SHORT);
 mytoast.show();

                        Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                mytoast.cancel();
                            }
                        }, 5000);// 5 sec
0
other Tall guy

Je ne crois pas que cela puisse être fait, vous ne pouvez utiliser que Toast.LENGTH_LONG ou Toast.LENTH_SHORT si vous ne pouvez pas définir votre vitesse connue. 

0
Boardy

J'ai créé une classe ToastMessage dans le côté droïde.

   public class ToastMessage: IToast
        {
            public void LongAlert(string message)
            {
                Toast toast = Toast.MakeText(Android.App.Application.Context, message, ToastLength.Short);
                toast.Show();
                Device.StartTimer(TimeSpan.FromSeconds(0.5), () =>
                {               
                   toast.Cancel();
                    return false;
                });
            }
        }

J'ai créé l'interface IToast

 public  interface IToast
    {
        void LongAlert(string message);
    }

Appel par service de dépendance

 DependencyService.Get<IToast>().LongAlert("Right Answer");
0
Mudit Sharma

Vous pouvez également modifier le modèle de l'exemple Toast.LENGTH_LONG:

Toast.makeText(getBaseContext(),"your message",Toast.LENGTH_LONG*3).show();

Rappelant que le motif a une durée de 1 seconde

0
João Vitor

Essayez-le d'abord. Cela définit le pain grillé sur une période spécifique en millisecondes:

public void toast(int millisec, String msg) {
    Handler handler = null;
    final Toast[] toasts = new Toast[1];
    for(int i = 0; i < millisec; i+=2000) {
        toasts[0] = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
        toasts[0].show();
        if(handler == null) {
            handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    toasts[0].cancel();
                }
            }, millisec);
        }
    }
}
0
LEMUEL ADANE