2013-06-01 19 views
0

在我的應用中切換片段之前,我通過Toast提供用戶反饋。一旦吐司出現,它永遠不會清除。退出活動或殺死整個事情是清除吐司的唯一方法。當我交換片段時Toasts永遠不會清除

我試圖在提交FragmentTransaction之後保留對Toast的引用並調用cancel(),但是當我這樣做時,Toast永遠不會出現。

我已經添加了日誌記錄,並確定Toast只顯示一次,而不是循環或重複。該應用程序仍然是響應,否則,而不是掛起。當我退出應用程序時,Toast清除了onStop()中的cancel()。

public final class MyActivity extends SherlockFragmentActivity { 

    Toast toast = null; 

    //... 

    @Override 
    protected void onStop() { 
     if (toast != null) toast.cancel(); 
     toast = null; 
     super.onStop(); 
    } 

    //... 

    private final class MyServiceReceiver extends ResultReceiver { 

     public MyServiceReceiver(Handler handler) { 
      super(handler); 
     } 

     @Override 
     protected void onReceiveResult(int resultCode, Bundle resultData) { 
      if (resultCode == MY_ERROR_CODE) { 
       toast = Toast.makeText(getApplicationContext(), "my error message", Toast.LENGTH_SHORT); 
       toast.show(); 

       FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
       ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, 
          android.R.anim.fade_in, android.R.anim.fade_out); 
       ft.replace(R.id.main_layout, new MyFragment()); 
       ft.commit(); 

       //if (toast != null) toast.cancel(); 
       //toast = null; 
      } 
     } 

    } 

} 

回答

0

這裏的問題是IntentService正在調用ResultReceiver,因此Toast正在UI線程之外創建。 See this post

爲了解決,我爲Activity創建了一個處理程序,並在那裏創建Toasts。作爲獎勵,看起來我不必管理對Toast的引用,並在Activity.onStop上清除。

0

您正在將應用程序上下文傳遞到您的Toast,Toast生命週期將與您的應用程序的上下文綁定。你應該通過你目前的活動。

toast = Toast.makeText(this,「my error message」,Toast.LENGTH_SHORT);

toast.show();

+0

我認爲這是可取的綁定到應用程序上下文?由於活動可能會在提交敬酒後退出。 'this'不是Activity,因爲這個Toast顯示在ResultReceiver類中。我試圖將ResultReciever內容移到另一個可以訪問'this'的方法,但結果是一樣的。吐司出現並永不消失。 –

+0

我看到Toast在你的內部類MyServiceReceiver下,你不需要移動你的代碼來使用它,可以使用Toast.makeText(MyActivity.this,「my error message」,Toast.LENGTH_SHORT).show() 。更重要的是確保你的麪包不被多次調用。請讓我知道這對你有沒有用。 – Ethan

+0

謝謝,我仍然有一兩件事來了解Java。使用Activity上下文仍然沒有解決問題。 ResultReceiver是從一個IntentService中調用的,所以在非UI線程中,[我現在看到Toasts必須從UI線程創建](http://stackoverflow.com/questions/12407910/android-toast-從-intentservice-仍然-屏幕換過?LQ = 1)。 –

相關問題