1. 程式人生 > >Android不同版本上Toast連續顯示的問題

Android不同版本上Toast連續顯示的問題

Toast可以用來顯示提示資訊,如果使用者連續做某個動作,持續不斷的彈出Toast,預設情況下會都顯示出來,由於是toast是排隊顯示的,這樣就會持續很長時間。

通過檢視API可知,可以執行show顯示之前,先呼叫cancel取消之前的顯示,這樣就不會出現連續顯示的問題,只顯示最後一次的提示。

但是,不是所有的版本上都可以這樣使用的。通過檢視Toast類的cancel函式可知,cancel函式在不同版本上有變化。如果是在2.3,4.0版本上,執行cancel後接著呼叫show函式就會丟擲異常,log提示toast的view沒有設定。如下所示:

01-01 09:07:45.490 D/AndroidRuntime( 2147): Shutting down VM
01-01 09:07:45.490 W/dalvikvm( 2147): threadid=1: thread exiting with uncaught exception (group=0x4001d878)
01-01 09:07:45.490 E/AndroidRuntime( 2147): FATAL EXCEPTION: main
01-01 09:07:45.490 E/AndroidRuntime( 2147): java.lang.RuntimeException: setView must have been called
01-01 09:07:45.490 E/AndroidRuntime( 2147): at android.widget.Toast.show(Toast.java:98)”異常處理

原因是因為Toast的cancel函式,把Toast的mNextView成員變數置為null了,所以會提示沒有設定view。

那麼,我們在顯示之前先設定一下Toast的setView函式,可以把第一次建立的Toast物件,通過getView方法取得view,待以後通過setView來設定要顯示的view。

這樣雖然不會出現以上異常,但是toast還是顯示不出來。原因需要進一步調查Toast的cancel,show等方法來查證。

目前,有另外一個方法可以解決toast連續顯示的問題,那就是不用cancel方法。而是在第二次及以後顯示toast時,使用setView,setText,setDuration方法來重新設定view,text,duration;這樣再執行show時,就會按照最後一次的設定來顯示,顯示時間就是setDuration設定的時間,顯示時間可以設定為Toast.LENGTH_SHORT和Toast.LENGTH_LONG。

需要設定setView是因為在toast顯示完後,再次設定setText時,因為mNextView為null丟擲以下toast沒有建立的錯誤。

This Toast was not created with Toast.makeText()

所以setView也是必需的。

通過以上方法就可以避免使用cancel丟擲異常的問題,又能解決toast多次持續顯示的問題。

其實在4.0中不設定view和duraion,只設置text也是可以的,在toast顯示時會實時更新text顯示,並重新計時,不會出現toast延遲顯示的問題。

在不同版本上Toast類的處理機制變化較大,需要好好研究才能正確使用,對不同版本上的程式碼移植帶來了麻煩。

參考: