我有一个简单的应用程序,带有一个按钮并单击它上面的监听器,它显示一个吐司,其中包含对该按钮执行的点击次数:
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()
}
我总是可以取消当前显示的吐司并创建新的吐司,但我想知道是否有办法更新现有吐司上的文字,并告诉它在新创建的吐司的持续时间内留在屏幕上。
答案 0 :(得分:1)
即使有,也不要这样做。
从用户体验的角度来看,想象一下如果Toast
弹出并说Your file was saved
,然后突然变为Your file wasn't saved
。
如果两条消息之间没有明确定义的图形事务,用户很可能会错过文本更新。
这就是Toast
应该是immutable
元素的原因。
如果您需要传达新内容,请使用其他Toast
。
这实际上是某些Android
设备中存在的问题:后续两个Toast
消息通常不会fade-out
和fade-in
强调;如果两条消息之间的文本长度非常相似,你可能不会注意到后者。
答案 1 :(得分:1)
您可以执行类似的操作,而不是使用相同的Toast对象。如您所知,每次创建新对象时,由于它的边界为method level
,因此garbage collector
可以轻松捕获对象。
private fun updateToast(String message) {
count++
Toast.makeText(context, message, Toast.LENGTH_LONG).show()
}
现在从clickListner调用此方法。
如果你想一次显示一个吐司,那么你可以从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
}
希望这会对你有所帮助。