安卓Toast自定义及防止重复显示

一、概述

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 mQueue = new LinkedList<>();

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/

点赞(117) 打赏

评论列表 共有 1 条评论

百合花太纯洁 2年前 回复TA

关难不难,要看去分辨,其实成功并不远,努力才会梦实现,拼搏才有别样天,事情总是苦后甜,钢铁总是炼后坚。

立即
投稿
发表
评论
返回
顶部