Android:在旧烤面包上设置新文本并更新持续时间

时间:2018-03-07 09:39:48

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

我有一个简单的应用程序,带有一个按钮并单击它上面的监听器,它显示一个吐司,其中包含对该按钮执行的点击次数:

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

我总是可以取消当前显示的吐司并创建新的吐司,但我想知道是否有办法更新现有吐司上的文字,并告诉它在新创建的吐司的持续时间内留在屏幕上。

2 个答案:

答案 0 :(得分:1)

即使有,也不要这样做。

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

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

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

如果您需要传达新内容,请使用其他Toast

这实际上是某些Android设备中存在的问题:后续两个Toast消息通常不会fade-outfade-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
    }

希望这会对你有所帮助。