一、概述
Toast是一种简单的提醒方式,它可以在屏幕上显示一段文字或者图片,通常用于操作成功或失败、操作完成或提醒用户注意事项等场景。使用Toast可以避免弹出对话框或者切换页面等方式,使得提醒更加轻量级和友好。本文将介绍如何使用安卓自带的Toast进行自定义和防止重复显示。
二、基本用法
安卓中使用Toast非常简单,只需要调用Toast的静态方法makeText()创建Toast对象,然后调用show()方法即可。
```
Toast.makeText(getApplicationContext(), “Hello Toast!”, Toast.LENGTH_SHORT).show();
```
上面的代码中,“getApplicationContext()”是获取当前应用程序的上下文,第二个参数是Toast显示的文本内容,第三个参数是Toast显示的时间长度。
三、自定义Toast
虽然Toast提供了默认样式,但是在实际应用中,我们通常需要根据项目需求来自定义Toast的样式。下面列举一些实现自定义Toast的方式。
1. 设置Toast文字和背景颜色
```
Toast toast = Toast.makeText(getApplicationContext(), "Hello Toast!", Toast.LENGTH_SHORT);
TextView textView = toast.getView().findViewById(android.R.id.message);
textView.setTextColor(Color.WHITE);
toast.getView().setBackgroundResource(R.drawable.toast_bg);
toast.show();
```
上面代码中,通过toast.getView()获取到Toast的View对象,然后通过findViewById方法找到id为android.R.id.message的TextView,textView的属性就可以按照想要的方式进行修改。
toast.getView().setBackgroundResource(R.drawable.toast_bg)是设置Toast的背景颜色。
2. 设置Toast的显示位置
默认情况下Toast会显示在屏幕中间位置,如果需要显示在其他位置可以使用setGravity()方法来设置。
```
toast.setGravity(Gravity.BOTTOM | Gravity.CENTER, 0, 100);
```
setGravity()方法有三个参数,第一个参数表示Toast显示的位置,第二个参数是x轴的偏移量,第三个参数是y轴的偏移量。
3. 自定义布局
如果上述方式无法满足需求,可以通过自定义Toast布局来实现。需注意Toast的布局不能太复杂,否则会对APP的性能和启动速度产生较大影响。
```
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_toast, null);
TextView text = layout.findViewById(R.id.text);
text.setText("Hello Toast!");
Toast toast = new Toast(getApplicationContext());
toast.setView(layout);
toast.setDuration(Toast.LENGTH_SHORT);
toast.show();
```
上面的代码中,先通过LayoutInflater的inflate()方法从XML布局文件中获取到一个View布局对象,再通过toast.setView()方法将toast的布局设置为我们自定义的布局文件custom_toast.xml。
四、防止Toast重复显示
当应用的某个操作需要频繁地弹出Toast的时候,可能会出现多个Toast在短时间内重复显示的情况,甚至可能由于显示太多Toast而导致应用崩溃或者运行缓慢,因此需要对Toast进行优化,来避免重复弹出问题。下面是几种方便好用的方法,供大家参考。
1. 替换Toast
创建Toast时,如果Toast还未消失,就直接用新的Toast对象覆盖旧的Toast,达到防止重复出现的效果。
```
private static Toast mToast;
public static void showToast(Context context, String message) {
if (mToast == null) {
mToast = Toast.makeText(context.getApplicationContext(), message, Toast.LENGTH_SHORT);
} else {
mToast.setText(message);
}
mToast.show();
}
```
2. Handler控制Toast显示
创建一个Handler对象,当发现Toast已经在显示时,不再发送延时消息。
```
private Handler mHandler = new Handler();
private Toast mToast;
private Object mLockObject = new Object();
public void showToast(Context context, String message) {
synchronized (mLockObject) {
if (mToast != null) {
mToast.setText(message);
} else {
mToast = Toast.makeText(context.getApplicationContext(), message, Toast.LENGTH_SHORT);
}
mHandler.removeCallbacks(r);
mHandler.postDelayed(r, 2000);
mToast.show();
}
}
private Runnable r = new Runnable() {
@Override
public void run() {
synchronized (mLockObject) {
mToast = null;
}
}
};
```
每次显示Toast时,使用synchronized对mToast加锁,保证Toast不被其他线程同时访问。在发送显示Toast的延时消息之前,先调用Handler的removeCallbacks方法,清除该Handler中原有的所有延时消息。这样可以避免Toast重复在屏幕上显示的问题。
3. 队列控制Toast的显示
将Toast对象保存到队列中,每次弹出Toast前先检查队列是否已有Toast正在显示,如果没有,则弹出队列中的Toast。
```
public class ToastQueue {
private static ToastQueue mInstance = new ToastQueue();
private Queue private Toast mCurrentToast; private Context mContext; public static ToastQueue getInstance() { return mInstance; } public void init(Context context){ mContext = context.getApplicationContext(); } public void add(ToastMessage message){ synchronized (mQueue){ mQueue.offer(message); process(); } } private void process(){ synchronized (mQueue){ if(mCurrentToast!=null){ return; } if(mQueue.isEmpty()){ return; } mCurrentToast = getCurrentToast(); mCurrentToast.show(); } } private Toast getCurrentToast(){ ToastMessage message = mQueue.peek(); Toast toast = Toast.makeText(mContext, message.getMessage(), message.getDuration()); toast.setGravity(message.getGravity()|Gravity.CENTER, message.getXOffset(), message.getYOffset()); return toast; } public void notifyFinished(){ synchronized (mQueue){ mQueue.poll(); mCurrentToast = null; process(); } } } public class ToastMessage { private String message; private int duration; private int gravity; private int xOffset; private int yOffset; public ToastMessage(String message, int duration, int gravity, int xOffset, int yOffset) { this.message = message; this.duration = duration; this.gravity = gravity; this.xOffset = xOffset; this.yOffset = yOffset; } public String getMessage() { return message; } public int getDuration() { return duration; } public int getGravity() { return gravity; } public int getXOffset() { return xOffset; } public int getYOffset() { return yOffset; } } ``` 以上是队列控制Toast的示例代码,利用队列的数据结构,实现了Toast的轻量级缓存,避免了Toast的重复出现。 五、总结 通过本文,我们了解了如何使用安卓自带的Toast进行自定义和防止重复显示。Toast虽然是一种简单的提醒方式,但它可以使提醒更加轻量级和友好,适用于一些简单的操作。 同时,在开发过程中,为了让应用更加稳定和流畅,需要避免各种异常和低效操作。Toast是一个比较容易使应用变得低效或异常的控件,通过本文所提供的方法,可以在保持Toast原生功能的情况下,避免对应用造成不良影响。 如果你喜欢我们三七知识分享网站的文章,
欢迎您分享或收藏知识分享网站文章
欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
关难不难,要看去分辨,其实成功并不远,努力才会梦实现,拼搏才有别样天,事情总是苦后甜,钢铁总是炼后坚。