How can I show a toast for a specific duration?

前端 未结 12 2135
自闭症患者
自闭症患者 2020-12-08 01:08

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\         


        
相关标签:
12条回答
  • 2020-12-08 01:29

    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.

    0 讨论(0)
  • 2020-12-08 01:30

    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);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-08 01:40

    Accepted answer is correct but in my case the toast blink(show & hide) can be noticed..

    I got a solution where Toast is not blinking and you can customise the Toast as well.

    Lets begin,

    1) Create a class Named LongToast.

    class LongToast {
    
    private LongToast() {}
    
    static void makeLongToast(Context context,String text, long durationInMillis) 
    {
    
     final Toast toastMessage = new Toast(context);
    
     //Creating TextView.
     TextView textView = new TextView(context);
    
     //Setting up Text Color.
     textView.setTextColor(Color.parseColor("#fafafa"));
    
     //Setting up Text Size.
     textView.setTextSize(17);
    
     //Setting up Toast Message Text.
     textView.setText(text);
    
     //Add padding to Toast message.
     textView.setPadding(20, 20, 20, 23);
    
     //Add Gravity TextView.
     textView.setGravity(Gravity.CENTER);
    
     //Adding TextView into Toast.
     toastMessage.setView(textView);
    
     //Access toast message as View.
     View toastView = toastMessage.getView();
    
     //Set Custom Background on Toast.
     toastView.setBackgroundResource(R.drawable.test);
    
    
     new CountDownTimer(durationInMillis, 1000)
      {
       public void onTick(long millisUntilFinished)
       {
        toastMessage.show();
       }
      public void onFinish()
       {
        toastMessage.cancel();
       }
    
      }.start();
     }
    }
    

    2) Create a drawable xml for customising the Toast.

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
     <shape android:shape="rectangle">
     <solid android:color="#009973"/>
     <corners android:radius="20dp" />
     <stroke
      android:width="4dp"
      android:color="#01ffc0"
     />
    </shape>
    

    you can customise the toast as per your need.

    3) Finally Calling Toast.

    LongToast.makeLongToast(this,"whatever you want",10000);//duration in seconds
    

    ref : click here to check

    Thanks!!.

    0 讨论(0)
  • 2020-12-08 01:43

    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.

    0 讨论(0)
  • 2020-12-08 01:46

    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.

    0 讨论(0)
  • 2020-12-08 01:48

    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);
    
    0 讨论(0)
提交回复
热议问题