【问题标题】:Android: Setting new text on old toast and renew durationAndroid:在旧吐司上设置新文本并更新持续时间
【发布时间】:2018-03-07 09:39:48
【问题描述】:

我有一个带有按钮的简单应用程序,并在其上单击侦听器,它会显示一个带有已在按钮上执行的点击次数的 toast:

class MainActivity : AppCompatActivity() {

    private val toast by lazy { Toast.makeText(this, "", LENGTH_LONG) }
    var count = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener { updateToast() }
    }

    private fun updateToast() {
        count++
        toast.setText(count.toString())
        toast.show()
    }
}

我遇到的问题是,每次点击后吐司的持续时间都没有更新,并且在点击 20 次后(例如)吐司消失并且不再显示,即使我在显示之前再次设置了持续时间:

private fun updateToast() {
    count++
    toast.setText(count.toString())
    toast.duration = LENGTH_LONG
    toast.show()
}

我总是可以取消当前显示的 toast 并创建新的,但我想知道是否有办法更新现有 toast 上的文本并告诉它在新创建的 toast 期间保持在屏幕上。

【问题讨论】:

    标签: android kotlin toast duration kotlin-android-extensions


    【解决方案1】:

    即使有,也不要那样做。

    从用户体验的角度来看,想象一下如果弹出一个Toast 并说Your file was saved,然后它突然变成Your file wasn't saved

    如果两条消息之间没有明确定义的图形事务,用户很可能会错过文本更新。

    这就是为什么 Toast 应该是 immutable 元素。

    如果您需要交流新内容,请使用不同的Toast


    这实际上是一些Android 设备中的问题:两个后续的Toast 消息通常不足以fade-outfade-in 强调;如果两条消息之间的文本长度非常相似,您可能不会注意到后者。

    【讨论】:

      【解决方案2】:

      您可以执行以下操作,而不是使用相同的 Toast 对象。如您所知,每次创建新对象时,但因为它的边界是 method level,所以对象很容易被 garbage collector 捕获。

      private fun updateToast(String message) {
              count++
      
              Toast.makeText(context, message, Toast.LENGTH_LONG).show()
      
          }
      

      现在从您的 clickListner 调用此方法。

      如果你想一次显示一个 toast,那么你可以借助 toast 类的 isShown() 方法。

      public void showAToast (String st){ //"Toast toast" is declared in the class
              try{ toast.getView().isShown();     // true if visible
                  toast.setText(st);
              } catch (Exception e) {         // invisible if exception
                  toast = Toast.makeText(theContext, st, toastDuration);
                  }
              toast.show();  //finally display it
          }
      

      希望这会对你有所帮助。

      【讨论】:

      • 是的,这是一个选项,但我只想在屏幕上显示一个吐司。您的建议将显示多个堆叠的吐司。
      • 是的将是更好的选择。你也可以试试snackbar,它在设计和ui/ux方面比toast更有优势。
      • 这不适用于 Android 11+,因为 toast.getView() 总是返回 null。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 2016-07-19
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多