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


参考:

Android4.0 Toast显示问题分析


发布了270 篇原创文章 · 获赞 273 · 访问量 377万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览