【问题标题】:What is the duration of a Toast LENGTH_LONG and LENGTH_SHORTToast LENGTH_LONG 和 LENGTH_SHORT 的持续时间是多少
【发布时间】:2011-12-19 09:23:16
【问题描述】:

我需要以毫秒 (ms) 为单位的 LENGTH_LONG 和 LENGTH_SHORT 的确切持续时间。我还需要知道带有 LENGTH_LONG 的 Toast 消息的持续时间在任何手机和任何 API 版本中是否具有相同的持续时间。

有人知道定义的持续时间在哪里吗?我的意思是在 ms 中定义。我知道 LENGTH_LONG 是一些值为 1 的 int const。但我找不到实际定义的持续时间在哪里。

【问题讨论】:

  • 您是否尝试在 setDuration() 中仅指定毫秒数?文档说它应该是用户可配置的,但没有具体说明这个问题

标签: android time toast duration milliseconds


【解决方案1】:

回复here。就像你提到的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

【讨论】:

    【解决方案2】:

    Toast.LENGTH_SHORTToast.LENGTH_LONG 只是标志。
    您可以在这里找到官方的android source,其中定义了这些标志

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

    【讨论】:

    • 现在改成: static final int LONG_DELAY = PhoneWindowManager.TOAST_WINDOW_TIMEOUT; static final int SHORT_DELAY = 2000; // 2 seconds still the same
    【解决方案3】:

    确实不允许我们更改 Toast 的持续时间。但是,如果您正在寻找替代方案并且您确实需要使用 Toast 来执行此操作,那么您可以试试这个。

    在下一行保留另一个重复的 toast

    例如:

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

    用户不会检测到 2 个 toast 之间的转换有任何变化。

    谢谢。

    【讨论】:

    • 由于在之前的回复中明确提到它是“不可能的”,我提供了一种替代方法,并且我也明确提到了它。希望你能理解。我现在刚刚搜索,发现那里有同样的问题,并仔细阅读了其中一些是替代方案的答案。但我没有为他们找到任何反对票。找到替代方案比说不可能更好,对吧?希望这是有道理的。 Can an Android Toast be longer than “Toast.LENGTH_LONG”?
    【解决方案4】:

    您需要设置持续时间覆盖,在操作中使用setDuration,例如:

    int s = 6000; // milisegundo    
    Snackbar.make(coordinatorLayout, "This is my Snackbar", Snackbar.LENGTH_LONG).setDuration(s)
    .show();
    

    【讨论】:

      【解决方案5】:

      我想知道你为什么不使用 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。
      【解决方案6】:

      LENGTH_SHORT & LENGTH_LONG 映射到时间间隔 1 秒 (1000mS)5 秒 (5000mS)

      要了解这一点,您需要深入研究 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

      【讨论】:

        【解决方案7】:

        通过反复试验我发现Toast.LENGTH_LONG 的持续时间非常接近2500ms

        【讨论】:

          猜你喜欢
          • 2019-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-05
          • 1970-01-01
          • 2013-09-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多