5

在此处输入图像描述 在此处输入图像描述

单击按钮时,我正在显示一个简单的 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();
    }
}

我该怎么做?

4

3 回答 3

7

嗨我有同样的问题。问题是 Toast 重叠,例如,如果您按 10 次,Toast 将保持 10 x LENGTH_SHORT。我提出的唯一解决方案是控制我自己展示 Toast 的时间。当您显示 Toast 时,只需记录您上次显示它的时间,它仍在屏幕上,不再显示它。在最坏的情况下,Toast 将仅在 LENGTH_SHORT 时间内可见。

于 2011-03-14T07:18:56.863 回答
6

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

于 2012-06-28T14:11:46.047 回答
1

这个简单的解决方案非常适合我,它是一个取消当前显示的所有 toast 的单例:

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 个不同的 toast(#1 和 #2)时,当您启动 #1 时,您将无法再取消它们:发生这种情况是因为单例将 #2 保存为“当前”即使它还没有显示。因此,当您再次启动 #1 时,它仍会添加到 2 个 Toast 的队列中:#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);
    }
}

请注意,如果有人想知道:我提出了一个新问题,我的解决方案是否不会造成任何问题: 静态上下文保存在 Application 类中并用于单例 toast 构建器中,这会造成内存泄漏吗?

于 2016-11-13T11:12:55.437 回答