2011-03-31 14 views
9

我有以下代碼:如何取消在android上使用其他方法創建的Toast?

private Toast movieRecordToast; 

    private void displayNextMovie() { 
     if (movieRecordToast != null) movieRecordToast.cancel(); // cancel previous Toast (if user changes movies too often) 
     movieRecordToast = Toast.makeText(getApplicationContext(), "Next", Toast.LENGTH_SHORT); 
     movieRecordToast.show(); 

    private void displayPrevMovie() { 
     if (movieRecordToast != null) movieRecordToast.cancel(); 
     movieRecordToast = Toast.makeText(getApplicationContext(), "Prev", Toast.LENGTH_SHORT); 
     movieRecordToast.show();   

但如果displayNextMovie迅速叫了幾次,然後displayPrevMovie被稱爲「下一步」吐司仍顯示,顯示的是「上一頁」之後。 看起來取消無法正常工作。

+0

UPD。看看其他問題關於相同的 - 看起來像android只是不取消吐司太快... – 2011-03-31 17:28:29

+1

作爲一邊,爲什麼你沒有一個單一的功能'私人無效displayMovieToast(字符串s)'採取「上一個「或」下一步「作爲參數? – rajath 2011-03-31 17:31:02

回答

28

相反,你需要一個新的文本顯示,你可以很容易地堅持只有一個Toast對象每次創建一個新Toast對象並隨時取消當前的Toast。在顯示下一個Toast之前,您可以使用Toast.setText()函數更改文本。

示例代碼:

private Toast mToastText; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Create the object once. 
    mToastText = Toast.makeText(this, "", Toast.LENGTH_SHORT); 
} 

private void displayText(final String message) { 
    mToastText.cancel(); 
    mToastText.setText(message); 
    mToastText.show(); 
} 
+3

我喜歡你的解決方案,但現在我的敬酒只是沒有出現。有任何想法嗎? :? – AlvaroSantisteban 2013-08-12 21:57:01

+4

在我的情況下,mToastText.cancel()表示不顯示Toast。沒有它,完美的作品。 :) – AlvaroSantisteban 2013-08-12 22:05:53

+0

完美的爲我工作,謝謝。這已經讓我煩惱了很多年! – jason 2013-08-27 00:56:27

0

我認爲有很多方法可以實現向用戶顯示next/prev信息。我會拋棄敬酒,更新TextView的文本名稱爲next/prev movie。這將消除你的問題,恕我直言,使更好的用戶界面。

但是,如果你的設計要求並索要Toast通知,請嘗試:

private Toast nextMovieRecordToast; 
private Toast prevMovieRecordToast; 


private void displayNextMovie() { 
    if (prevMovieRecordToast != null) prevMovieRecordToast.cancel(); // cancel previous Toast (if user changes movies too often) 
    nextMovieRecordToast = Toast.makeText(getApplicationContext(), "Next", Toast.LENGTH_SHORT); 
    nextMovieRecordToast.show();} 

private void displayPrevMovie() { 
    if (nextMovieRecordToast != null) nextMovieRecordToast.cancel(); 
    prevMovieRecordToast = Toast.makeText(getApplicationContext(), "Prev", Toast.LENGTH_SHORT); 
    prevMovieRecordToast.show(); }  
+0

謝謝@OceanBlue。不過,我認爲如果多次調用displayNextMovie,你的方法將無法工作 - 將會有一個「Next」消息隊列 – 2011-03-31 18:25:16

+0

嗯,我想這取決於你想要什麼。用戶將看到「Prev」烤麪包。背後的「下一個」敬酒將超時。所以如果你運行這個代碼,效果應該是你想要的。然而......你確定你必須使用敬酒來達到這個目的? – OceanBlue 2011-03-31 18:53:16

0

的wroclai的解決方案是優秀的!然而,當從長信息吐司形成短信時,它將螺絲擰緊,反之亦然。 要解決這個問題,而不是使用以前的對象重新創建它。因此,而不是這行:
mToastText.setText(message);
寫這一個:myToast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
的動畫看起來也更好:)

相關問題