在Android中转到另一个屏幕时停止所有Toast消息

问题描述 投票:4回答:3

enter image description here enter image description here

当我点击按钮时,我正在显示一个简单的Toast。我的问题是,当我多次点击一个按钮时,Toast消息会一直显示,直到我进入主屏幕。当我到达主屏幕并在相应的活动中杀死Toast消息时,我想停止Toast。我附上了截图。

我编写的代码如下:

public class Main extends Activity {

    Dialog d;
    Toast t;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ((Button)findViewById(R.id.button1)).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                t = Toast.makeText(Main.this, "you clicked on button!", Toast.LENGTH_LONG);
                t.show();
            }
        });
    }
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        t.cancel();
    }
}

我该怎么做?

android toast
3个回答
7
投票

嗨,我有同样的问题。问题是Toast重叠,例如如果按10次Toast将保持10 x LENGTH_SHORT。我带来的唯一解决方案是控制Toast由我自己显示的时间。当您显示Toast时,只需跟踪上次显示它,它仍然在屏幕上不再显示它。在最糟糕的情况下,Toast仅在LENGTH_SHORT时间可见。


6
投票

Toast.makeText返回Toast对象。您可以在此对象上调用cancel()以取消它,然后显示新对象。


1
投票

这个简单的解决方案非常适合我,一个取消任何当前显示的祝酒词的单身人士:

public enum SingleToast {
    INSTANCE;

    private Toast currentToast;
    private String currentMessage;

    public void show(Context context, String message, int duration) {
        if (message.equals(currentMessage)) {
            currentToast.cancel();
        }
        currentToast = Toast.makeText(context, message, duration);
        currentToast.show();

        currentMessage = message;
    }
}

如果您想要取消任何Toast(即使消息不同),您可以省略整个currentMessage部分并包含currentToast!= null作为取消检查。

第一种方法的缺点是当你开始2个不同的吐司(#1和#2)时,当你开始#1时你将无法取消它们:这是因为单身人士将#2保存为'当前'即使它还没有显示。因此,当你再次启动#1时,它仍会被添加到2个Toasts的队列中:#1,#2,#1,并且所有将显示。

因此,选择适合您用途的这两种解决方案中的任何一种,或者使用计时器扩展这个简单的单例,猜测这就是Mojo所建议的。

调用toast很简单:我用它来显示一些自定义异常的消息:

public abstract class CustomToastException extends Exception {
    public CustomToastException(String message) {
        super(message);
        SingleToast.INSTANCE.show(context, getMessage(), Toast.LENGTH_LONG);
    }
}

请注意,如果有人想知道:我提出了一个新的问题,我的解决方案是否不会造成任何麻烦:Static context saved in Application class and used in a singleton toast builder, does this create a memory leak?

© www.soinside.com 2019 - 2024. All rights reserved.