一个Toast消息的持续时间是多久?LENGTH_LONG和LENGTH_SHORT分别表示什么意思?

111
我需要知道LENGTH_LONG和LENGTH_SHORT的确切持续时间(以毫秒为单位)。同时,我想知道使用长度为LENGTH_LONG的Toast消息在任何手机上和任何API版本中是否具有相同的持续时间。
请问,谁知道这些持续时间是在哪里定义的?我是指以毫秒为单位的定义。我知道LENGTH_LONG是一个int常数,其值为1。但我找不到实际持续时间的定义位置。

你尝试过在setDuration()中只指定毫秒吗?文档说它应该是可配置的,但对此问题并没有具体说明。 - Konstantin Pribluda
7个回答

207

这里有答案。就像你提到的那样,Toast.LENGTH_SHORTToast.LENGTH_LONG不是以毫秒为单位的,而是0或1。

实际持续时间为:

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

16

Toast.LENGTH_SHORTToast.LENGTH_LONG只是标志。

您可以在此处找到官方Android源代码,其中定义了这些标志。

public class NotificationManagerService extends SystemService {

    static final int LONG_DELAY = PhoneWindowManager.TOAST_WINDOW_TIMEOUT;
    /** Amount of time (in milliseconds) a toast window can be shown. */
    //public static final int TOAST_WINDOW_TIMEOUT = 3500; // 3.5 seconds
    static final int SHORT_DELAY = 2000; // 2 seconds

    private void scheduleDurationReachedLocked(ToastRecord r)
    {
       mHandler.removeCallbacksAndMessages(r);
       Message m = Message.obtain(mHandler, MESSAGE_DURATION_REACHED, r);
       int delay = r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY;
       //....
       mHandler.sendMessageDelayed(m, delay);
     }
}

1
现在,它被改为: static final int LONG_DELAY = PhoneWindowManager.TOAST_WINDOW_TIMEOUT; static final int SHORT_DELAY = 2000; // 两秒钟仍然一样 - Mayank Sharma

9

确实我们不能改变Toast的持续时间。但是如果您正在寻找一种替代方法,并且真的需要使用Toast来实现此目的,那么可以尝试以下方法。

在下一行中保留另一个重复的Toast

例如:

Toast.makeText(this, "Hello StackOverFlow", Toast.LENGTH_LONG).show();
Toast.makeText(this, "Hello StackOverFlow", Toast.LENGTH_LONG).show();

用户在两个提示框之间不会检测到任何转换。
谢谢。

3
由于之前的回复中明确提到“不可能实现”,因此我提供了一种替代方法,并且我也清楚地说明了。希望您能理解。我刚刚搜索并发现有同样类型的问题,浏览了答案,其中一些是替代方案。但是我没有看到它们被投票否决。找到替代方案比被告知“不可能实现”要更好,不是吗?希望这有意义。能否让Android Toast时间超过“Toast.LENGTH_LONG”? - PasinduJay

5
您需要设置持续时间覆盖,在操作中使用setDuration,例如:
int s = 6000; // milisegundo    
Snackbar.make(coordinatorLayout, "This is my Snackbar", Snackbar.LENGTH_LONG).setDuration(s)
.show();

3

我想知道为什么你不使用Toast.java类中支持的setDuration()方法?

 /**
 * Set how long to show the view for.
 * @see #LENGTH_SHORT
 * @see #LENGTH_LONG
 */
public void setDuration(@Duration int duration) {
    mDuration = duration;
}

你只能分配一个int值:LENGTH_SHORT或LENGTH_LONG。 - Gabriele Mariotti

2

LENGTH_SHORTLENGTH_LONG分别映射到1秒(1000毫秒)5秒(5000毫秒)的时间间隔。

要查看此内容,您需要深入了解Toast的AOSP源代码。在Toast类中,时间间隔是基于FLAG决定的。

mParams.hideTimeoutMilliseconds = mDuration == Toast.LENGTH_LONG ? LONG_DURATION_TIMEOUT : SHORT_DURATION_TIMEOUT;

其中:

  static final long SHORT_DURATION_TIMEOUT = 5000;
  static final long LONG_DURATION_TIMEOUT = 1000;

https://android.googlesource.com/platform/frameworks/base/+/f4bed684c939b0f8809ef404b8609fe4ef849263/core/java/android/widget/Toast.java


0

通过不断的尝试,我发现Toast.LENGTH_LONG持续时间非常接近于2500毫秒


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接