Android: 在旧吐司上设置新文本并更新持续时间

Android: Setting new text on old toast and renew duration

我有一个简单的应用程序,它有一个按钮和点击侦听器,它显示一个 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()
    }
}

我遇到的问题是每次点击后 toast 的持续时间不会更新,在 20 次点击后(例如)toast 消失并且再也不会显示,即使我在显示之前再次设置它的持续时间也是如此:

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

我总是可以取消当前显示的 toast 并创建新的,但我想知道是否有一种方法可以更新现有 toast 上的文本并让它在新创建的期间保留在屏幕上干杯。

即使有,也不要那样做。

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

如果两条消息之间没有 well-defined 图形处理,用户很可能会错过文本更新。

这就是 Toast 应该是 immutable 元素的原因。

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


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

您可以这样做,而不是使用相同的 Toast 对象。如您所知,每次创建新对象时,因为它的边界是 method level,所以对象很容易被 garbage collector.

捕获
private fun updateToast(String message) {
        count++

        Toast.makeText(context, message, Toast.LENGTH_LONG).show()

    }

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

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

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
    }

希望对您有所帮助。