How can I show a toast for a specific duration?

2019-01-16 16:37发布

问题:

This is the way I have to show the Toast for 500 milliseconds. Though, it's showing more than a second.

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

How can I show Toast only for 500 milliseconds?

回答1:

This cannot be done. To show a toast for a length shorter than Toast.LENGTH_SHORT, you must cancel it after the time you want. Something like:

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


回答2:

Adding to @Senth's answer, if you don't wont to accumulate the time when you call the showToast method multiple times, with the same 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();
}

You can display toast now for 500 ms like this:

showToast("Not Allowed", 500);


回答3:

I found this answer. Albeit a bit more complex it also allows you to create toasts longer than Toast.LENGTH_LONG. You might have to change the tick duration from 1000ms to 500ms.

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

Here is how it works: the countdown has a notification time shorter than the duration for which the toast is displayed according to the flag, so the toast can be shown again if the countdown is not finished. If the toast is shown again while it is still on screen, it will stay there for the whole duration without blinking. When the countdown is finished, the toast is cancelled to hide it even if its display duration is not over.

This works even if the toast must be shown for a duration shorter than the default duration: the first toast displayed will simply be cancelled when the countdown is finished.



回答4:

Can't do what you are asking with the standard Toasts. Perhaps you should think about integrating a 3rd party library that gives you better Toast options (named Crouton). I haven't used it myself, but people seem to like it.

You can't control the length of Toasts in the standard OS.

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



回答5:

This can't be done. The values of Toast.LENGTH_SHORT and Toast.LENGTH_LONG are 0 and 1. This means they are treated as flags rather than actual durations so I don't think it will be possible to set the duration to anything other than these values.



回答6:

This one is working fine for me.

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

the countdown is used to display a toast message for a specific duration.



回答7:

I don't believe this can be done, you can only use Toast.LENGTH_LONG or Toast.LENTH_SHORT you can't define your know speed.



回答8:

Try it first. This sets toast to a specific period in milli-seconds:

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


回答9:

I tried different method and this method works for me

 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


回答10:

I have created a class ToastMessage in droid side.

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

I have created interface IToast

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

Calling By Dependency Service

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


回答11:

You can also modify the pattern of the Toast.LENGTH_LONG example:

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

Remembering that the pattern has a duration of 1 second



回答12:

Toast.makeText(LiveChar.this,"Typing",Toast.LENGTH_SHORT);

This is the only way you can..