9

我有以下代码:

private Toast movieRecordToast;

    private void displayNextMovie() {
        if (movieRecordToast != null) movieRecordToast.cancel(); // cancel previous Toast (if user changes movies too often)
        movieRecordToast = Toast.makeText(getApplicationContext(), "Next", Toast.LENGTH_SHORT);
        movieRecordToast.show();

    private void displayPrevMovie() {
        if (movieRecordToast != null) movieRecordToast.cancel();
        movieRecordToast = Toast.makeText(getApplicationContext(), "Prev", Toast.LENGTH_SHORT);
        movieRecordToast.show();        

但是如果displayNextMovie被快速调用几次然后displayPrevMovie被调用,“Next” Toast 仍然显示并且只有在“Prev”之后才会显示。取消似乎无法正常工作。

4

3 回答 3

29

Toast无需在每次想要显示新文本时创建新对象,您可以轻松地只保留一个Toast对象并随时取消当前对象Toast。在Toast显示下一个之前,您可以使用功能更改文本Toast.setText()

示例代码:

private Toast mToastText;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Create the object once.
    mToastText = Toast.makeText(this, "", Toast.LENGTH_SHORT);
}

private void displayText(final String message) {
    mToastText.cancel();
    mToastText.setText(message); 
    mToastText.show();
}
于 2011-03-31T18:55:31.380 回答
0

wroclai的解决方案非常好!但是,当从长消息吐司变为短消息吐司时,它会破坏吐司,反之亦然。要解决此问题,而不是使用以前的对象重新创建它。所以代替这一行:
mToastText.setText(message);
写这个:myToast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
动画也看起来更好:)

于 2015-02-04T20:28:21.377 回答
0

我认为有很多方法可以实现向用户显示下一个/上一个信息。我会完全放弃祝酒词,并用下一个/上一个电影的名称更新 TextView 的文本。这将消除您的问题,而且恕我直言,可以提供更好的用户界面。

但是,如果您的设计要求确实需要 toast 通知,请尝试:

    private Toast nextMovieRecordToast;
private Toast prevMovieRecordToast;


private void displayNextMovie() {
    if (prevMovieRecordToast != null) prevMovieRecordToast.cancel(); // cancel previous Toast (if user changes movies too often)
    nextMovieRecordToast = Toast.makeText(getApplicationContext(), "Next", Toast.LENGTH_SHORT);
    nextMovieRecordToast.show();}

private void displayPrevMovie() {
    if (nextMovieRecordToast != null) nextMovieRecordToast.cancel();
    prevMovieRecordToast = Toast.makeText(getApplicationContext(), "Prev", Toast.LENGTH_SHORT);
    prevMovieRecordToast.show();    }    
于 2011-03-31T17:38:04.377 回答