关于Android Toast
来源:互联网 发布:湖北省近20年gdp数据 编辑:程序博客网 时间:2024/06/14 18:02
使用Toast一般会用下面这条语句:
Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_SHORT).show();
但有一个问题,如果频繁使用toast会导致其长时间显示。
这和Toast的实现原理是有关系的。
Toast在调用其show方法时,并不是立刻显示出来,而是添加到系统的一个队列中。
而在这个队列中,先添加进去的Toast先被显示出来,所以说,刚show的Toast并不会立刻显示,而是要等队列中之前被添加的Toast显示完之后才可以显示。
而这个队列中是可以保存相当多数量的Toast的,如果你一次性new出多个Toast并将它们都show了一遍,系统就会依次一个个将这些Toast全部显示一遍,时间很长,可能你应用都退了,但是Toast还在显示。
(PS:这种情况并不少见。可能你设置用户点击一次按钮显示一次Toast,谁也不能保证用户不会一直狂按这个按钮。)
这样的情况其实是很影响用户体验的。
但有解决办法。
先贴代码:
private static Toast myToast;public static void showToast(Context context, String str) { if(myToast == null) { myToast = Toast.makeText(context, str, Toast.LENGTH_SHORT); } else { myToast.setText(str); } myToast.show(); }
在new一个Toast之前先判断这个myToast是不是为NULL,如果不是NULL,就不要再去new了,以免队列中存放过多的Toast。
如果不为NULL,只是改变了myToast的显示文字,并调用show()方法。
这样就避免队列中产生大量Toast了。
另外,贴两个自定义Toast的代码:
这是一个添加了一张图片的Toast。
其实看Toast的源码就知道,Android默认的Toast的布局就是一个LinearLayout里面一个TextView。
使用:
(LinearLayout)Toast.getView();
拿到这个View并强转成LinearLayout就可以随意向其中增加或移除View了。
private static Toast myIconToast;public static void showIconToast(Context context, String str, int resId) { if(myIconToast == null) { myIconToast = Toast.makeText(context, str, Toast.LENGTH_SHORT); myIconToast.setGravity(Gravity.CENTER, 0, 0); LinearLayout toastLinearLayout = (LinearLayout) myIconToast.getView(); ImageView imageView = new ImageView(context); imageView.setImageResource(resId); toastLinearLayout.addView(imageView, 0); } else { myIconToast.setText(str); LinearLayout toastLinearLayout = (LinearLayout) myToast.getView(); ImageView imageView = new ImageView(context); imageView.setImageResource(resId); toastLinearLayout.removeViewAt(0); toastLinearLayout.addView(imageView, 0); } myIconToast.show(); }
第二个是一个完全自定义的Toast,布局由我们自己定义,
利用LayoutInflater拿到我们自定义的布局后,使用:
Toast.setView()
即可实现自定义布局的Toast。
private static Toast myCustomToast;public static void showCustomToast(Activity activity, String title, String text, int resId) { LayoutInflater inflater = activity.getLayoutInflater(); View layout = inflater.inflate(R.layout.custom_toast_layout, null); TextView titleView = (TextView) layout.findViewById(R.id.tvTitleToast); titleView.setText(title); ImageView imageView = (ImageView) layout.findViewById(R.id.tvImageToast); imageView.setImageResource(resId); TextView textView = (TextView) layout.findViewById(R.id.tvTextToast); textView.setText(text); if(myCustomToast == null) { myCustomToast = new Toast(activity); myCustomToast.setGravity(Gravity.RIGHT | Gravity.TOP, 300, 300); myCustomToast.setDuration(Toast.LENGTH_SHORT); myCustomToast.setView(layout); } else { myCustomToast.setView(layout); } myCustomToast.show(); }
需要注意的是,这几个方法里使用的Toast都是成员变量。
- 关于Android Toast
- 关于Android Toast
- 关于android中的Toast的用法
- android 关于Toast重复显示解决方法
- android开发中,关于Toast大小问题
- android 关于Toast重复显示解决方法
- android 关于Toast重复显示解决方法
- 关于android toast的简单使用
- 关于Android中Toast使用小结
- android 关于Toast重复显示解决方法
- 解决android 关于Toast重复显示解决方法
- 关于Android 自定义Toast显示风格
- Android中关于定制Toast使用总结
- Android中关于Toast的使用体会
- 关于Toast
- 关于Toast
- 关于toast
- 关于Toast
- 输出各种形式的分数
- QT中QSystemTrayIcon
- JavaScript uploadify插件上传文件问题
- UserAction extends ActionSupport implements ModelDriven<User> .tmp 上传图片文件
- CocoasPod与GitHub的区别
- 关于Android Toast
- 三种方式实现显示模板轮廓
- 单例模式与线程安全
- Struts2中使用DMI(动态方法调用)
- hdu 4508
- CodeForces 638A Home Numbers
- freopen
- CodeForces解题报告——4
- JQuery插件的写法