2010-05-02 84 views
47

如何刪除當前顯示的所有Toast消息?Android - 隱藏所有顯示的Toast消息

在我的應用程序中,有一個列表,當用戶點擊一個項目時,會顯示一個toast消息,其中有10個項目--10個toast消息。

所以如果用戶點擊10次,然後按下菜單按鈕,他們必須等待幾秒鐘,直到他們能夠讀取菜單選項文本。

它不應該是這樣的:)

+0

可能重複的[Android取消吐司當退出應用程序,當顯示吐司](http://stackoverflow.com/questions/16098151/android-cancel-toast-when-exiting-the-app-and-當烤麪包被顯示時) – 2016-08-16 21:02:29

回答

29

如何禁用所有敬酒消息 是當前正在處理?

您可以通過Toast對象上調用cancel()取消個人Toasts。 AFAIK,但你無法取消所有未完成的Toasts

+0

嗯,非常感謝,會嘗試創造一些東西。 但如果我將所有吐司消息添加到某種結構...有沒有可能檢查哪些已顯示,哪些不顯示。 我很忙,同時......請求並且不要嘗試,至少我會在本週結束時嘗試構建一些東西(最遲)。 -thanks! - – crazyV 2010-05-03 05:14:43

+8

這是我最新的Android寵物狗:無法取消所有排隊的Toasts。 – 2010-09-08 20:48:12

+2

真是令人失望:如果您取消當前的烤麪包,只有在這道麪包即將顯示的時間過後纔會顯示後面的烤麪包。 – 2014-09-16 12:11:33

76

我的解決方案是在活動中初始化一個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(); 
} 
+2

感謝您的回答,上面的CommonsWare已經解釋了禁用排隊的Toast消息列表...... :) thx,但是sry ..我想你誤解了這個問題! – cV2 2010-12-21 09:18:29

+2

雖然這是一個很好的答案,但實際上它並不是相同的行爲。有了這個解決方案,你永遠不會有兩個吐司相繼出現。 – 2013-07-16 19:08:51

7

Mudar的美麗解決方案爲我工作在一個類似的問題 - 我有各種各樣的祝酒詞後,多次button點擊堆放在積壓。

Toast不同的一個例子setText()sshow() s就是我正在尋找的答案 - 只要點擊一個新按鈕,就會取消先前的消息。在

僅供參考點,這是我沒有...

OnCreate

final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT); 

在每個OnClick

myToast.setText(R.string.toast1); 
myToast.show(); 
+1

我低估了這一點,因爲我覺得它沒有增加任何新內容。這可能是Mudar回答的一個評論。 – 2013-07-16 19:10:15

0
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(); 

      } 
     }); 
+0

這與Mudar的回答基本相同。 – 2013-07-16 19:11:29

-10

以下是如何禁用吐司消息,刪除show()表達式。

//Disable notification message 
Toast.makeText(this,"Message",Toast.LENGTH_SHORT); 

//Enable notification message 
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show(); 
+1

這並不禁用它們,只是從不顯示它們。不一樣的東西! – 2013-07-16 19:14:02

+1

雖然 – Machado 2015-09-09 16:23:07

3

我想我找到了一種方法來讓敬酒信息不會爲我排隊。以爲我會分享。

這部分在頂部。

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秒鐘,然後將我的吐司對象設置爲空,並允許它再次顯示。

+1

很有趣您的Handler.postDelayed解決方案很有趣,+1。 – 2013-07-16 19:12:59

10

如何檢查是否已經顯示吐司?

private Toast toast; 
... 
void showToast() { 
    if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) { 
     toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG); 
     toast.show(); 
    } 
} 
+0

這對我來說最合適,因爲我有一對滑塊,當用戶在玩它們時,每個滑塊可以每秒產生幾個Toasts。感謝您的貢獻。 – pete 2017-07-28 18:19:57

1

這就是我該怎麼做的。

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(); 
0

您可以使用這樣的..

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(); 
} 
} 
+2

歡迎來到SO&謝謝你的分享。嘗試將一些描述性文本添加到僅用於代碼的答案中。 [「我如何寫出一個好的答案?」](http://stackoverflow.com/help/how-to-answer)。 _Brevity是可以接受的,但更全面的解釋更好._ – 2014-07-26 16:20:46

0

使用上述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實例的可能缺點。

3

我的解決方法是保存所有敬酒引用列表中,使一個方法來取消所有他們的時候需要它:

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(); 

您可以像靜態創建此方法在全局類中,並用它來殺死應用程序的所有敬酒。

1

這裏是我的簡單答案的問題:

首先在您的活動創建一個全局Toast對象。

private Toast example; 

現在,每當你要調用一個新的吐司消息只是這樣做:

if(buttonClicked) { 
    example.cancel(); 
    example = Toast.makeText(this, "" , Toast.LENGTH_SHORT); 
    example.setText("Button Clicked"); 
    example.show(); 
} 

這樣可以使所有的祝酒詞在一箇中央麪包和吐司刪除垃圾郵件。這是一個快速粗略的解決方案,所以也許有一種更優雅的方式來做到這一點。

0

在我的應用程序中,當應用程序進入後臺時,排隊等待的敬酒一次又一次出現,所以我沒有按照以下方式解決問題。

添加代碼以檢測應用何時進入後臺。註冊生命週期處理程序的一種方法。對於更多細節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();方法顯示敬酒。代碼很有趣。請享用!