I am displaying a simple Toast when I click a button. My issue is, when I click on a button multiple times, that Toast message keeps displaying until I get to the main screen. I would like to stop the Toast when I get to the main screen and kill the Toast message in the corresponding activity. I have attached a screenshot.
I have written code as follows:
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();
}
}
How can I do it?
Hi I have the same problem. The problem is that the Toast overlaps e.g. if you press 10 times the Toast will stay 10 x LENGTH_SHORT. The only solution I came with was to control the time the Toast is shown by myself. When you show a Toast just keep a track of the last time you show it, it's still on the screen don't show it again. In your worst case the Toast will be visible only LENGTH_SHORT time.
Toast.makeText
returns a Toast object. You can callcancel()
on this object to cancel it, then show the new one.This simple solution works perfectly for me, a singleton which cancels any currently shown toasts:
If you'd like to cancel ANY Toast (even if the messages are different), you could leave out the whole currentMessage part and include currentToast != null as a check for cancelling.
Drawback of the first method is that when you start 2 different toasts (#1 & #2), you won't be able to cancel them anymore when you start #1: this happens because the singleton saved #2 as the 'current' even though it is not shown yet. So when you start #1 again it is still added to the queue of 2 Toasts: #1, #2, #1, and all will be shown.
So choose whatever of these 2 solutions fits your usecase, or extend this simple singleton with timers, guess that's what Mojo suggested.
Calling the toast is simple: I use it to show the message of some custom exceptions:
Note, in case anyone was wondering: I've raised a new question whether my solution does not cause any trouble: Static context saved in Application class and used in a singleton toast builder, does this create a memory leak?