如何刪除當前顯示的所有Toast消息?Android - 隱藏所有顯示的Toast消息
在我的應用程序中,有一個列表,當用戶點擊一個項目時,會顯示一個toast消息,其中有10個項目--10個toast消息。
所以如果用戶點擊10次,然後按下菜單按鈕,他們必須等待幾秒鐘,直到他們能夠讀取菜單選項文本。
它不應該是這樣的:)
如何刪除當前顯示的所有Toast消息?Android - 隱藏所有顯示的Toast消息
在我的應用程序中,有一個列表,當用戶點擊一個項目時,會顯示一個toast消息,其中有10個項目--10個toast消息。
所以如果用戶點擊10次,然後按下菜單按鈕,他們必須等待幾秒鐘,直到他們能夠讀取菜單選項文本。
它不應該是這樣的:)
如何禁用所有敬酒消息 是當前正在處理?
您可以通過Toast
對象上調用cancel()
取消個人Toasts
。 AFAIK,但你無法取消所有未完成的Toasts
。
嗯,非常感謝,會嘗試創造一些東西。 但如果我將所有吐司消息添加到某種結構...有沒有可能檢查哪些已顯示,哪些不顯示。 我很忙,同時......請求並且不要嘗試,至少我會在本週結束時嘗試構建一些東西(最遲)。 -thanks! - – crazyV 2010-05-03 05:14:43
這是我最新的Android寵物狗:無法取消所有排隊的Toasts。 – 2010-09-08 20:48:12
真是令人失望:如果您取消當前的烤麪包,只有在這道麪包即將顯示的時間過後纔會顯示後面的烤麪包。 – 2014-09-16 12:11:33
我的解決方案是在活動中初始化一個Toast。然後在每次點擊時更改文字。
Toast mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
if (a) {
mToast.setText("This is a");
mToast.show();
} else if (b) {
mToast.setText("This is b");
mToast.show();
}
感謝您的回答,上面的CommonsWare已經解釋了禁用排隊的Toast消息列表...... :) thx,但是sry ..我想你誤解了這個問題! – cV2 2010-12-21 09:18:29
雖然這是一個很好的答案,但實際上它並不是相同的行爲。有了這個解決方案,你永遠不會有兩個吐司相繼出現。 – 2013-07-16 19:08:51
Mudar的美麗解決方案爲我工作在一個類似的問題 - 我有各種各樣的祝酒詞後,多次button
點擊堆放在積壓。
Toast不同的一個例子setText()s
和show()
s就是我正在尋找的答案 - 只要點擊一個新按鈕,就會取消先前的消息。在
僅供參考點,這是我沒有...
在OnCreate
:
final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT);
在每個OnClick
:
myToast.setText(R.string.toast1);
myToast.show();
我低估了這一點,因爲我覺得它沒有增加任何新內容。這可能是Mudar回答的一個評論。 – 2013-07-16 19:10:15
mToast=Toast.makeText(this, "", Toast.LENGTH_LONG);
showToast.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mToast.cancel();
String text=null;
if(ON)
{
text="Toast is on";
}
else
{
text="Toast is off";
}
mToast.setText(text);
mToast.setDuration(Toast.LENGTH_SHORT);
mToast.show();
}
});
這與Mudar的回答基本相同。 – 2013-07-16 19:11:29
以下是如何禁用吐司消息,刪除show()
表達式。
//Disable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT);
//Enable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show();
這並不禁用它們,只是從不顯示它們。不一樣的東西! – 2013-07-16 19:14:02
雖然 – Machado 2015-09-09 16:23:07
我想我找到了一種方法來讓敬酒信息不會爲我排隊。以爲我會分享。
這部分在頂部。
private Toast msg;
這部分進入我的setOnTouchListener()
if(null == msg)
{
msg = Toast.makeText("Message to user!", Toast.LENGTH_SHORT);
msg.setGravity(Gravity.CENTER, msg.getXOffset()/2, msg.getYOffset()/2);
msg.show();
//handels the stupid queueing toast messages
new Handler().postDelayed(new Runnable()
{
public void run()
{
msg = null;
}
}, 2000);
}
它更是一個黑客比什麼的。但是,只要有人喜歡我的應用程序的一部分,我就會顯示敬酒信息。如果他們瘋狂點擊最喜歡的按鈕,它會發出敬酒信息。但現在不行了。它會等待2秒鐘,然後將我的吐司對象設置爲空,並允許它再次顯示。
很有趣您的Handler.postDelayed解決方案很有趣,+1。 – 2013-07-16 19:12:59
如何檢查是否已經顯示吐司?
private Toast toast;
...
void showToast() {
if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG);
toast.show();
}
}
這對我來說最合適,因爲我有一對滑塊,當用戶在玩它們時,每個滑塊可以每秒產生幾個Toasts。感謝您的貢獻。 – pete 2017-07-28 18:19:57
這就是我該怎麼做的。
Toast toast;
if(toast==null)
toast=Toast.makeText(getApplicationContext(),R.string.act_now_private_post_text,Toast.LENGTH_LONG);
else
toast.setText(R.string.act_now_private_post_text);
toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL,10,10);
toast.show();
您可以使用這樣的..
class MyToast {
private static Toast t;
public MyToast(Context ctx, String message) {
if (t != null) {
t.cancel();
t = null;
}
t = Toast.makeText(ctx, message, Toast.LENGTH_SHORT);
}
public void show() {
t.show();
}
}
歡迎來到SO&謝謝你的分享。嘗試將一些描述性文本添加到僅用於代碼的答案中。 [「我如何寫出一個好的答案?」](http://stackoverflow.com/help/how-to-answer)。 _Brevity是可以接受的,但更全面的解釋更好._ – 2014-07-26 16:20:46
使用上述Madur的出色答卷,我延長到這一點,將處理不同類型的消息類:
public class ToastManager {
private Toast toastWarningMessage;
private Toast toastAddMessage;
...
public void messageWarning(Context context, String message) {
if(toastWarningMessage == null) {
toastWarningMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT);
} else {
toastWarningMessage.cancel();
toastWarningMessage.setText(message);
}
toastWarningMessage.show();
}
public void messageAdd(Context context, String message) {
if(toastAddMessage == null) {
toastAddMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT);
} else {
toastAddMessage.cancel();
toastAddMessage.setText(message);
}
toastAddMessage.show();
}
...
}
而且這是從我的主要活動內調用:
ToastManager toastManager;
...
private void toastWarningMessage(String message) {
if(toastManager == null) toastManager = new ToastManager();
toastManager.messageWarning(this, message);
}
對消息進行分類的原因是爲了確保沒有重要的消息被覆蓋。此解決方案似乎易於重用,因爲它只涉及重命名Toasts和函數名稱。
當用戶發送按鈕時,每次對於相同的消息類型,Toast都會取消。唯一的問題是如果用戶可以發送混合消息。這導致第一條消息重複,並且一旦它最終到期,其他消息每個都會顯示一次。不是一個真正的大問題,而是需要注意的一些問題。
我還沒有研究過多個Toast實例的可能缺點。
我的解決方法是保存所有敬酒引用列表中,使一個方法來取消所有他們的時候需要它:
private ArrayList<Toast> msjsToast = new ArrayList<Toast>();
private void killAllToast(){
for(Toast t:msjsToast){
if(t!=null) {
t.cancel();
}
}
msjsToast.clear();
}
當你創建一個吐司做這種方式並保存參考:
Toast t = Toast.makeText(context, "Download error: xx", Toast.LENGTH_LONG);
t.show();
msjsToast.addToast(t);
當您需要將其刪除:
killAllToast();
您可以像靜態創建此方法在全局類中,並用它來殺死應用程序的所有敬酒。
這裏是我的簡單答案的問題:
首先在您的活動創建一個全局Toast
對象。
private Toast example;
現在,每當你要調用一個新的吐司消息只是這樣做:
if(buttonClicked) {
example.cancel();
example = Toast.makeText(this, "" , Toast.LENGTH_SHORT);
example.setText("Button Clicked");
example.show();
}
這樣可以使所有的祝酒詞在一箇中央麪包和吐司刪除垃圾郵件。這是一個快速粗略的解決方案,所以也許有一種更優雅的方式來做到這一點。
在我的應用程序中,當應用程序進入後臺時,排隊等待的敬酒一次又一次出現,所以我沒有按照以下方式解決問題。
添加代碼以檢測應用何時進入後臺。註冊生命週期處理程序的一種方法。對於更多細節ref
registerActivityLifecycleCallbacks(new MyLifecycleHandler());
App.inBackground = true;
當應用程序被切換到後臺,並使用SmartToast類
public class SmartToast {
static ArrayList<WeakReference<Toast>> toasts = new ArrayList<>();
public static void showToast(@NonNull Context context,@NonNull String message){
//this will not allowed to show toast when app in background
if(App.inBackground) return;
Toast toast = Toast.makeText(context,message,Toast.LENGTH_SHORT);
toasts.add(new WeakReference<>(toast));
toast.show();
//clean up WeakReference objects itself
ArrayList<WeakReference<Toast>> nullToasts = new ArrayList<>();
for (WeakReference<Toast> weakToast : toasts) {
if(weakToast.get() == null) nullToasts.add(weakToast);
}
toasts.remove(nullToasts);
}
public static void cancelAll(){
for (WeakReference<Toast> weakToast : toasts) {
if(weakToast.get() != null) weakToast.get().cancel();
}
toasts.clear();
}
}
呼叫時應用進入後臺以隱藏當前和所有未決的祝酒詞SmartToast.cancelAll();
方法顯示敬酒。代碼很有趣。請享用!
可能重複的[Android取消吐司當退出應用程序,當顯示吐司](http://stackoverflow.com/questions/16098151/android-cancel-toast-when-exiting-the-app-and-當烤麪包被顯示時) – 2016-08-16 21:02:29