您的位置:首页 > 移动开发 > Android开发

Android不同版本上Toast连续显示的问题

2012-07-04 11:39 239 查看
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类的处理机制变化较大,需要好好研究才能正确使用,对不同版本上的代码移植带来了麻烦。

参考:
Android4.0 Toast显示问题分析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: