关于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都是成员变量。

1 0
原创粉丝点击