首页 文章

Android Toast可以比Toast.LENGTH_LONG更长吗?

提问于
浏览
229

当使用setDuration()进行Toast时,是否可以设置自定义长度或至少比 Toast.LENGTH_LONG 更长的时间?

28 回答

  • 6

    您可以在 Toast.makeText(); 方法中设置所需的时间(以毫秒为单位),如下所示:

    //40 seconds
    long mToastLength = 40*1000 
    //this toast will be displayed for 40 seconds.
    Toast.makeText(this, "Hello!!!!!", mToastLength).show();
    
  • 0
    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();
          }
    
  • 0
    Toast.makeText(this, "Text", Toast.LENGTH_LONG).show(); 
    Toast.makeText(this, "Text", Toast.LENGTH_LONG).show();
    

    一个非常简单的问题解决方案 . 它们中的两倍或三倍将使Toast持续更长时间 . 这是唯一的方法 .

  • 2

    您可能想尝试:

    for (int i=0; i < 2; i++)
    {
          Toast.makeText(this, "blah", Toast.LENGTH_LONG).show();
    }
    

    加倍时间 . 如果指定3而不是2,它将使时间增加三倍 . 等等 .

  • 307

    LONG_DELAY 3.5 sec 的吐司显示和 2 secSHORT_DELAY 吐司显示 .

    Toast在内部使用INotificationManager,并在每次调用Toast.show()时调用它的enqueueToast方法 .

    使用SHORT_DELAY两次调用show()会再次将相同的Toast排入队列 . 它将显示 4 sec (2秒2秒) .

    同样,用LONG_DELAY两次调用show()会再次将相同的toast排入队列 . 它将显示 7 sec (3.5秒3.5秒)

  • 5

    正如其他人所提到的,Android Toasts可以是LENGTH_LONG或LENGTH_SHORT . 没有办法解决这个问题,也不应该遵循发布的任何“黑客” .

    Toasts的目的是显示“非必要”信息,并且由于它们的挥之不去的效果,如果消息的持续时间超过某个阈值,则消息可能远远超出上下文 . 如果修改了库存Toasts以便它们显示的时间长于LENGTH_LONG,则消息将在屏幕上停留,直到应用程序的进程终止,因为Toast视图被添加到WindowManager而不是应用程序中的ViewGroup . 我认为这就是硬编码的原因 .

    如果您绝对需要显示超过三秒半的Toast样式消息,我建议构建一个附加到Activity内容的视图,这样当用户退出应用程序时它将消失 . 我的SuperToasts库处理这个问题和许多其他人,随时使用它!您很可能对使用SuperActivityToasts感兴趣

  • 0

    如果你想要一个 Toast 持续存在,我发现你可以通过反复调用 Timer 来唤醒它(每秒钟左右应该这样做) . 如果 Toast 已经显示,则调用 show() 不会破坏任何内容,但它会刷新它在屏幕上停留的时间 .

  • 31

    这是我使用上面的代码制作的自定义Toast类:

    import android.content.Context;
    import android.os.CountDownTimer;
    import android.widget.Toast;
    
    public class CustomToast extends Toast {
        int mDuration;
        boolean mShowing = false;
        public CustomToast(Context context) {
            super(context);
            mDuration = 2;
        }
    
    
        /**
         * Set the time to show the toast for (in seconds) 
         * @param seconds Seconds to display the toast
         */
        @Override
        public void setDuration(int seconds) {
            super.setDuration(LENGTH_SHORT);
            if(seconds < 2) seconds = 2; //Minimum
            mDuration = seconds;
        }
    
        /**
         * Show the toast for the given time 
         */
        @Override
        public void show() {
            super.show();
    
            if(mShowing) return;
    
            mShowing = true;
            final Toast thisToast = this;
            new CountDownTimer((mDuration-2)*1000, 1000)
            {
                public void onTick(long millisUntilFinished) {thisToast.show();}
                public void onFinish() {thisToast.show(); mShowing = false;}
    
            }.start();  
        }
    }
    
  • 5

    将toast设置为特定时间段(以毫秒为单位):

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

    此文本将在5秒后消失 .

    final Toast toast = Toast.makeText(getApplicationContext(), "My Text", Toast.LENGTH_SHORT);
        toast.show();
    
        Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
               @Override
               public void run() {
                   toast.cancel(); 
               }
        }, 5000); // Change to what you want
    

    编辑:正如Itai Spector在评论中说它将显示约3.5秒,所以使用此代码:

    int toastDuration = 5000; // in MilliSeconds
        Toast mToast = Toast.makeText(this, "My text", Toast.LENGTH_LONG);
        CountDownTimer countDownTimer;
        countDownTimer = new CountDownTimer(toastDuration, 1000) {
            public void onTick(long millisUntilFinished) {
                mToast.show();
            }
    
            public void onFinish() {
                mToast.cancel();
            }
        };
    
        mToast.show();
        countDownTimer.start();
    
  • 8

    我知道我有点晚了,但是我把Regis_AG的答案包好了,并将它包装在一个帮助类中,效果很好 .

    public class Toaster {
      private static final int SHORT_TOAST_DURATION = 2000;
    
      private Toaster() {}
    
      public static void makeLongToast(String text, long durationInMillis) {
        final Toast t = Toast.makeText(App.context(), text, Toast.LENGTH_SHORT);
        t.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0);
    
        new CountDownTimer(Math.max(durationInMillis - SHORT_TOAST_DURATION, 1000), 1000) {
          @Override
          public void onFinish() {
            t.show();
          }
    
          @Override
          public void onTick(long millisUntilFinished) {
            t.show();
          }
        }.start();
      }
    }
    

    在您的应用程序代码中,只需执行以下操作:

    Toaster.makeLongToast("Toasty!", 8000);
    
  • 2

    创建稍长的消息的一种非常简单的方法如下:

    private Toast myToast;
    
    public MyView(Context context) {
      myToast = Toast.makeText(getContext(), "", Toast.LENGTH_LONG);
    }
    
    private Runnable extendStatusMessageLengthRunnable = new Runnable() {
      @Override
        public void run() {
        //Show the toast for another interval.
        myToast.show();
       }
    }; 
    
    public void displayMyToast(final String statusMessage, boolean extraLongDuration) {
      removeCallbacks(extendStatusMessageLengthRunnable);
    
      myToast.setText(statusMessage);
      myToast.show();
    
      if(extraLongDuration) {
        postDelayed(extendStatusMessageLengthRunnable, 3000L);
      }
    }
    

    请注意,上面的示例消除了LENGTH_SHORT选项以使示例保持简单 .

    您通常不希望使用Toast消息以非常长的间隔显示消息,因为这不是Toast类的预期目的 . 但是有些时候你需要显示的文本数量可能会让用户读取时间超过3.5秒,在这种情况下,稍微延长时间(例如,如上所示,为6.5秒)可以,IMO,是有用的并符合预期用途 .

  • 7

    避免按顺序启动的祝酒之间的褪色效果的最佳解决方案:

    final Toast tag = Toast.makeText(getBaseContext(), "YOUR MESSAGE",Toast.LENGTH_SHORT);
    
    tag.show();
    
    new CountDownTimer(9000, 1000)
    {
    
        public void onTick(long millisUntilFinished) {tag.show();}
        public void onFinish() {tag.show();}
    
    }.start();
    

    这里吐司显示大约10秒 .

    希望这可以帮助 .

  • 126

    安排倒计时,直到将来的某个时间,并在整个过程中定期通知 . 在文本字段中显示30秒倒计时的示例:

    new CountDownTimer(30000, 1000) {
    
         public void onTick(long millisUntilFinished) {
             mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
         }
    
         public void onFinish() {
             mTextField.setText("done!");
         }
      }.start();
    
  • -6

    LENGTH_SHORTLENGTH_LONG的值为0和1.这意味着它们被视为标志而不是实际持续时间,因此我认为不可能将持续时间设置为除这些值之外的任何值 .

    如果要向用户显示更长时间的消息,请考虑Status Bar Notification . 状态栏通知可以在不再相关时以编程方式取消 .

  • 15

    使用Crouton,它是一个非常灵活的Toast库 .

    Crouton

    你可以像吐司一样使用它:

    Crouton.makeText(context, "YOUR_MESSAGE", Style.INFO);
    

    或者你甚至可以更深入地定制它,比如将时间设置为无限!例如,在这里我想显示一个Toast消息,直到用户通过点击它来确认它 .

    private static void showMessage(final Activity context, MessageType type, String header, String message) {
        View v = context.getLayoutInflater().inflate(R.layout.toast_layout, null);
        TextView headerTv = (TextView) v.findViewById(R.id.toastHeader);
        headerTv.setText(header);
        TextView messageTv = (TextView) v.findViewById(R.id.toastMessage);
        messageTv.setText(message);
        ImageView toastIcon = (ImageView) v.findViewById(R.id.toastIcon);
    
        final Crouton crouton = getCrouton(context, v);
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Crouton.hide(crouton);
            }
        });
    
        crouton.show();
    }
    
    private static Crouton getCrouton(final Activity context, View v) {
        Crouton crouton = Crouton.make(context, v);
        crouton.setConfiguration(new Configuration.Builder().setDuration(Configuration.DURATION_INFINITE).build());
        return crouton;
    }
    

    客户布局将为吐司充气 .

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true"
        android:background="@drawable/shadow_container"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:padding="@dimen/default_margin"
        tools:ignore="Overdraw">
    
        <ImageView
            android:id="@+id/toastIcon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/default_spacing_full"
            android:layout_weight="1"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/toastHeader"
                style="@style/ItemText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <TextView
                android:id="@+id/toastMessage"
                style="@style/ItemSubText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
        </LinearLayout>
    
    </LinearLayout>
    
  • 1

    这是一个非常简单的方法,对我有用:

    for (int i=0; i < 3; i++) { Toast.makeText(this, "MESSAGE", Toast.LENGTH_SHORT).show(); }

    LENGTH_SHORT的持续时间为2秒,LENGTH_LONG为3.5秒,此处将显示 6 Seconds 的toast消息,因为它包含在for循环中 . 但是这种方法的缺点是在每2秒之后可能出现小的褪色效果 . 但它并不明显 . 希望它有所帮助

  • 10

    我开发了一个自定义Toast类,您可以使用它来显示Toast所需的持续时间(毫秒)

    import android.content.Context;
    import android.os.Build;
    import android.os.Handler;
    import android.util.Log;
    import android.util.TypedValue;
    import android.view.Gravity;
    import android.view.View;
    import android.view.WindowManager;
    import android.widget.TextView;
    
    public final class ToastHelper {
    
        private static final String TAG = ToastHelper.class.getName();
    
        public static interface OnShowListener {
            public void onShow(ToastHelper toast);
        }
    
        public static interface OnDismissListener {
            public void onDismiss(ToastHelper toast);
        }
    
        private static final int WIDTH_PADDING_IN_DIP = 25;
        private static final int HEIGHT_PADDING_IN_DIP = 15;
        private static final long DEFAULT_DURATION_MILLIS = 2000L;
    
        private final Context context;
        private final WindowManager windowManager;
        private View toastView;
    
        private int gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
        private int mX;
        private int mY;
        private long duration = DEFAULT_DURATION_MILLIS;
        private CharSequence text = "";
        private int horizontalMargin;
        private int verticalMargin;
        private WindowManager.LayoutParams params;
        private Handler handler;
        private boolean isShowing;
        private boolean leadingInfinite;
    
        private OnShowListener onShowListener;
        private OnDismissListener onDismissListener;
    
        private final Runnable timer = new Runnable() {
    
            @Override
            public void run() {
                cancel();
            }
        };
    
        public ToastHelper(Context context) {
            Context mContext = context.getApplicationContext();
            if (mContext == null) {
                mContext = context;
            }
            this.context = mContext;
            windowManager = (WindowManager) mContext
                    .getSystemService(Context.WINDOW_SERVICE);
            init();
        }
    
        private void init() {
            mY = context.getResources().getDisplayMetrics().widthPixels / 5;
            params = new WindowManager.LayoutParams();
            params.height = WindowManager.LayoutParams.WRAP_CONTENT;
            params.width = WindowManager.LayoutParams.WRAP_CONTENT;
            params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
            params.format = android.graphics.PixelFormat.TRANSLUCENT;
            params.type = WindowManager.LayoutParams.TYPE_TOAST;
            params.setTitle("ToastHelper");
            params.alpha = 1.0f;
            // params.buttonBrightness = 1.0f;
            params.packageName = context.getPackageName();
            params.windowAnimations = android.R.style.Animation_Toast;
        }
    
        @SuppressWarnings("deprecation")
        @android.annotation.TargetApi(Build.VERSION_CODES.JELLY_BEAN)
        private View getDefaultToastView() {
            TextView textView = new TextView(context);
            textView.setText(text);
            textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
            textView.setClickable(false);
            textView.setFocusable(false);
            textView.setFocusableInTouchMode(false);
            textView.setTextColor(android.graphics.Color.WHITE);
            // textView.setBackgroundColor(Color.BLACK);
            android.graphics.drawable.Drawable drawable = context.getResources()
                    .getDrawable(android.R.drawable.toast_frame);
            if (Build.VERSION.SDK_INT < 16) {
                textView.setBackgroundDrawable(drawable);
            } else {
                textView.setBackground(drawable);
            }
            int wP = getPixFromDip(context, WIDTH_PADDING_IN_DIP);
            int hP = getPixFromDip(context, HEIGHT_PADDING_IN_DIP);
            textView.setPadding(wP, hP, wP, hP);
            return textView;
        }
    
        private static int getPixFromDip(Context context, int dip) {
            return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                    dip, context.getResources().getDisplayMetrics());
        }
    
        public void cancel() {
            removeView(true);
        }
    
        private void removeView(boolean invokeListener) {
            if (toastView != null && toastView.getParent() != null) {
                try {
                    Log.i(TAG, "Cancelling Toast...");
                    windowManager.removeView(toastView);
                    handler.removeCallbacks(timer);
                } finally {
                    isShowing = false;
                    if (onDismissListener != null && invokeListener) {
                        onDismissListener.onDismiss(this);
                    }
                }
            }
        }
    
        public void show() {
            if (leadingInfinite) {
                throw new InfiniteLoopException(
                        "Calling show() in OnShowListener leads to infinite loop.");
            }
            cancel();
            if (onShowListener != null) {
                leadingInfinite = true;
                onShowListener.onShow(this);
                leadingInfinite = false;
            }
            if (toastView == null) {
                toastView = getDefaultToastView();
            }
            params.gravity = android.support.v4.view.GravityCompat
                    .getAbsoluteGravity(gravity, android.support.v4.view.ViewCompat
                            .getLayoutDirection(toastView));
            if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) {
                params.horizontalWeight = 1.0f;
            }
            if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) {
                params.verticalWeight = 1.0f;
            }
            params.x = mX;
            params.y = mY;
            params.verticalMargin = verticalMargin;
            params.horizontalMargin = horizontalMargin;
    
            removeView(false);
            windowManager.addView(toastView, params);
            isShowing = true;
            if (handler == null) {
                handler = new Handler();
            }
            handler.postDelayed(timer, duration);
        }
    
        public boolean isShowing() {
            return isShowing;
        }
    
        public void setDuration(long durationMillis) {
            this.duration = durationMillis;
        }
    
        public void setView(View view) {
            removeView(false);
            toastView = view;
        }
    
        public void setText(CharSequence text) {
            this.text = text;
        }
    
        public void setText(int resId) {
            text = context.getString(resId);
        }
    
        public void setGravity(int gravity, int xOffset, int yOffset) {
            this.gravity = gravity;
            mX = xOffset;
            mY = yOffset;
        }
    
        public void setMargin(int horizontalMargin, int verticalMargin) {
            this.horizontalMargin = horizontalMargin;
            this.verticalMargin = verticalMargin;
        }
    
        public long getDuration() {
            return duration;
        }
    
        public int getGravity() {
            return gravity;
        }
    
        public int getHorizontalMargin() {
            return horizontalMargin;
        }
    
        public int getVerticalMargin() {
            return verticalMargin;
        }
    
        public int getXOffset() {
            return mX;
        }
    
        public int getYOffset() {
            return mY;
        }
    
        public View getView() {
            return toastView;
        }
    
        public void setOnShowListener(OnShowListener onShowListener) {
            this.onShowListener = onShowListener;
        }
    
        public void setOnDismissListener(OnDismissListener onDismissListener) {
            this.onDismissListener = onDismissListener;
        }
    
        public static ToastHelper makeText(Context context, CharSequence text,
                long durationMillis) {
            ToastHelper helper = new ToastHelper(context);
            helper.setText(text);
            helper.setDuration(durationMillis);
            return helper;
        }
    
        public static ToastHelper makeText(Context context, int resId,
                long durationMillis) {
            String string = context.getString(resId);
            return makeText(context, string, durationMillis);
        }
    
        public static ToastHelper makeText(Context context, CharSequence text) {
            return makeText(context, text, DEFAULT_DURATION_MILLIS);
        }
    
        public static ToastHelper makeText(Context context, int resId) {
            return makeText(context, resId, DEFAULT_DURATION_MILLIS);
        }
    
        public static void showToast(Context context, CharSequence text) {
            makeText(context, text, DEFAULT_DURATION_MILLIS).show();
        }
    
        public static void showToast(Context context, int resId) {
            makeText(context, resId, DEFAULT_DURATION_MILLIS).show();
        }
    
        private static class InfiniteLoopException extends RuntimeException {
            private static final long serialVersionUID = 6176352792639864360L;
    
            private InfiniteLoopException(String msg) {
                super(msg);
            }
        }
    }
    
  • 88

    我知道答案很晚..我遇到了同样的问题,并决定实施我自己的裸骨版本Toast,在查看android的Toast源代码之后 .

    基本上,您需要创建一个新的窗口管理器,并使用处理程序显示和隐藏窗口所需的持续时间

    //Create your handler
     Handler mHandler = new Handler();
    
    //Custom Toast Layout
    mLayout = layoutInflater.inflate(R.layout.customtoast, null);
    
    //Initialisation 
    
    mWindowManager = (WindowManager) context.getApplicationContext()
                .getSystemService(Context.WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams();
    
    params.gravity = Gravity.BOTTOM
    params.height = WindowManager.LayoutParams.WRAP_CONTENT;
    params.width = WindowManager.LayoutParams.WRAP_CONTENT;
    params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
    params.format = PixelFormat.TRANSLUCENT;
    params.windowAnimations = android.R.style.Animation_Toast;
    params.type = WindowManager.LayoutParams.TYPE_TOAST;
    

    初始化布局后,您可以使用自己的隐藏和显示方法

    public void handleShow() {
        mWindowManager.addView(mLayout, mParams);
        }
    
        public void handleHide() {
            if (mLayout != null) {
                if (mLayout.getParent() != null) {
                    mWindowManager.removeView(mLayout);
                }
                             mLayout = null;
            }
    

    现在你只需要添加两个可运行的线程来调用handleShow()和handleHide(),你可以将它们发送给Handler .

    Runnable toastShowRunnable = new Runnable() {
            public void run() {
                handleShow();
            }
        };
    
     Runnable toastHideRunnable = new Runnable() {
            public void run() {
                handleHide();
            }
        };
    

    最后一部分

    public void show() {
    
        mHandler.post(toastShowRunnable);
        //The duration that you want
        mHandler.postDelayed(toastHideRunnable, mDuration);
    
    }
    

    这是一个快速而肮脏的实现..没有考虑任何性能 .

  • 1

    只需使用SuperToast即可在任何情况下制作优雅的吐司 . 祝你干杯 colourful . 编辑你的 font color 也是 size . 希望它能为你所有 .

  • 0

    如果你深入挖掘android代码,你可以找到明确指出的行,我们不能改变Toast消息的持续时间 .

    NotificationManagerService.scheduleTimeoutLocked() {
        ...
        long delay = immediate ? 0 : (r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY);
        }
    

    和期限的默认值是

    private static final int LONG_DELAY = 3500; // 3.5 seconds
    private static final int SHORT_DELAY = 2000; // 2 seconds
    
  • 4

    为什么吃Toast,当你可以拥有整个 Snackbarhttps://developer.android.com/reference/android/support/design/widget/Snackbar.html

    Snackbar> Toast,Custom Toast,Crouton

  • 1

    可以使用专门运行toast的线程来攻击Toast持续时间 . 这是有效的(运行吐司10秒,根据自己的喜好修改 sleepctr ):

    final Toast toast = Toast.makeText(this, "Your Message", Toast.LENGTH_LONG);
    
    Thread t = new Thread(){
        public void run(){
              int ctr = 0;
              try{
                   while( ctr<10 ){
                        toast.show();
                        sleep(1000);
                        ctr++;
                   }
              } catch (Exception e) {
                   Log.e("Error", "", e);
              }
         }
     };
     t.start();
    
  • 2

    我编写了一个辅助类来执行此操作 . 你可以在github上看到代码:https://github.com/quiqueqs/Toast-Expander/blob/master/src/com/thirtymatches/toasted/ToastedActivity.java

    这就是你如何显示祝酒5秒(或5000毫秒):

    Toast aToast = Toast.makeText(this, "Hello World", Toast.LENGTH_SHORT);
    ToastExpander.showFor(aToast, 5000);
    
  • 1

    在使用每个可用解决方案失败后,我终于使用递归进行了解决方法 .

    Code:

    //Recursive function, pass duration in seconds
    public void showToast(int duration) {
        if (duration <= 0)
            return;
    
        Toast.makeText(this, "Hello, it's a toast", Toast.LENGTH_LONG).show();
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                showToast(duration-1);
            }
        }, 1000);
    }
    
  • -2

    如果你需要一个长吐司,有一个实用的替代方案,但它需要你的用户点击一个确定按钮让它消失 . 您可以像这样使用AlertDialog:

    String message = "This is your message";
    new AlertDialog.Builder(YourActivityName.this)
        .setTitle("Optional Title (you can omit this)")
        .setMessage(message)
        .setPositiveButton("ok", null)
        .show();
    

    如果你有一条很长的消息,很可能,你不知道你的用户需要多长时间阅读消息,所以有时候要求你的用户点击OK按钮继续 . 就我而言,当用户点击帮助图标时,我会使用此技术 .

  • 13

    自定义背景和视图的吐司为我做了诀窍 . 我在nexus 7平板电脑上进行了测试,在循环过程中没有注意到fadein fadeout动画 . 继承人实施:

    public static void customToast(Context context, String message, int duration) {
    
        for (int i = 0; i < duration; i++) {
            Toast toast = new Toast(context);
            toast.setDuration(Toast.LENGTH_LONG);
            toast.setGravity(Gravity.CENTER, 0, 0);
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.toast_layout, null);
            TextView textViewToast = (TextView) view
                    .findViewById(R.id.textViewToast);
            textViewToast.setText(message);
            toast.setView(view);
            toast.show();
        }
    
    }
    

    下面是上面代码中使用的自定义textview:

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textViewToast"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/fragment_background"
    android:padding="8dp"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="@color/blue" />
    

    @ drawable / fragment_background正在使我的吐司有圆角,如kitkat版本 . 您也可以在文件中添加其他视图 . 我鼓励对改进和评论进行任何修改,因为我计划在我的实时应用中实现这一点 .

  • 116

    用户无法定制Toast的持续时间 . 因为NotificationManagerService的scheduleTimeoutLocked()函数不使用字段持续时间 . 源代码如下 .

    private void scheduleTimeoutLocked(ToastRecord r, boolean immediate)
        {
            Message m = Message.obtain(mHandler, MESSAGE_TIMEOUT, r);
            long delay = immediate ? 0 : (r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY);
            mHandler.removeCallbacksAndMessages(r);
            mHandler.sendMessageDelayed(m, delay);
        }
    

相关问题