当为Toast使用setDuration()时,是否可以设置一个自定义长度或至少比Toast. length_long更长的长度?


当前回答

如果你需要一个很长的Toast,有一个实用的替代方案,但它需要你的用户点击一个OK按钮来让它消失。你可以像这样使用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按钮来继续是一个好主意。在我的例子中,当用户单击帮助图标时,我使用了这种技术。

其他回答

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

我知道我有点晚了,但我取了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);

LENGTH_SHORT和LENGTH_LONG的值分别为0和1。这意味着它们被视为标志,而不是实际的持续时间,所以我认为不可能将持续时间设置为这些值以外的任何东西。

如果想要长时间地向用户显示消息,可以考虑使用状态栏通知。当状态栏通知不再相关时,可以通过编程方式取消它们。

如果你需要一个很长的Toast,有一个实用的替代方案,但它需要你的用户点击一个OK按钮来让它消失。你可以像这样使用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按钮来继续是一个好主意。在我的例子中,当用户单击帮助图标时,我使用了这种技术。

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

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秒)可能是有用的,并且与预期的用法一致。