
一、前言
在开发安卓应用时,我们可能需要使用Toast来提示用户一些消息。但是默认的Toast样式可能无法满足我们的需求,比如Toast的背景色、字体大小、显示时间等。此外,由于Toast的弹出过程较为频繁,可能会造成Toast的重复显示,给用户带来麻烦。因此,在这篇文章中,我们将介绍如何自定义Toast样式,并防止Toast的重复显示。
二、自定义Toast样式
首先,我们需要创建一个布局文件,来定义我们所需的样式。例如,下面是一个简单的自定义布局文件`toast_custom.xml`:
```xml
    android:layout_height="match_parent"     android:background="@drawable/toast_bg"     android:orientation="horizontal"     android:padding="10dp">              android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:paddingEnd="10dp"         android:paddingRight="10dp"         android:src="@drawable/ic_info" />              android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:textColor="@android:color/white"         android:textSize="16sp" />
```
上面的布局文件包含一个LinearLayout,其中包含一个ImageView和一个TextView,用于显示Toast的图标和消息内容。由于我们自定义了背景,因此我们在`android:background`属性中引用了一个`toast_bg`的背景文件。
接下来,我们需要定义一个Toast的样式类,来加载我们自定义的布局文件并显示Toast。在Toast样式类中,我们可以设置Toast的显示时间、位置等参数,例如下面是一个简单的自定义Toast类`CustomToast`:
```java
public class CustomToast {
public static void showToast(Context context, String message) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.toast_custom, null);
ImageView ivIcon = view.findViewById(R.id.iv_icon);
TextView tvMessage = view.findViewById(R.id.tv_message);
ivIcon.setImageResource(R.drawable.ic_info);
tvMessage.setText(message);
Toast toast = new Toast(context);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(view);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}
```
在上面的代码中,我们首先通过LayoutInflater来加载我们自定义的布局文件`toast_custom.xml`。然后,我们可以通过findViewById()方法来获取我们所需的ImageView和TextView实例,并对它们进行设置。最后,我们将自定义的布局文件作为Toast的View进行设置,并调用show()方法来显示Toast。
三、防止Toast的重复显示
在实际开发中,由于Toast的弹出频率比较高,可能会造成Toast的重复显示,给用户带来麻烦。因此,我们需要在显示Toast时进行判断,避免多次显示同一Toast。
为了实现这个功能,我们可以使用HashMap来存储已经显示的Toast实例,并在显示新的Toast实例之前进行判断。例如,下面是一个可以防止重复显示Toast的工具类`ToastUtils`:
```java
public class ToastUtils {
    private static final Map     public static void showToast(Context context, String message) {         if (sToastMap.containsKey(message)) {             return;         }         Toast toast = CustomToast.makeText(context, message);         sToastMap.put(message, toast);         toast.show();         new Handler().postDelayed(() -> {             sToastMap.remove(message);         }, toast.getDuration() == Toast.LENGTH_LONG ? 3500 : 2000);     } } ``` 在上面的代码中,我们首先使用HashMap来存储已经显示的Toast实例,其中key为Toast的消息内容,value为Toast实例。在显示新的Toast实例之前,我们需要通过containsKey()方法来判断HashMap中是否已经存在该消息内容对应的Toast实例。如果存在,则直接返回,避免重复显示。 如果HashMap中不存在该消息内容对应的Toast实例,则说明需要显示一个新的Toast。我们可以使用前面介绍的自定义Toast类来创建新的Toast实例,并将其添加到HashMap中。在显示Toast时,我们还可以通过postDelayed()方法来延迟一段时间后自动从HashMap中移除该Toast实例。由于Toast的显示时间可能不同,因此我们需要根据Toast的显示时间来设置延迟时间。例如,Toast.LENGTH_LONG的显示时间为3.5秒,而Toast.LENGTH_SHORT的显示时间为2秒。 需要注意的是,在使用HashMap存储Toast实例时,我们应该在适当的时候清除HashMap中的实例。如果将过多的Toast实例保存在HashMap中,既会占用较多的内存,也会降低Toast的显示效率。因此,我们可以在用户退出应用或回到后台时,清除HashMap中保存的Toast实例。 四、案例说明 下面是一个简单的案例来演示如何使用前面介绍的自定义Toast和防止重复显示Toast的工具类: ```java public class MainActivity extends AppCompatActivity {     private Button mBtnShowToast;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         mBtnShowToast = findViewById(R.id.btn_show_toast);         mBtnShowToast.setOnClickListener(v -> {             ToastUtils.showToast(this, "Hello World!");         });     } } ``` 在上面的代码中,我们创建了一个Button,用于触发显示Toast。当用户点击该Button时,我们通过ToastUtils.showToast()方法来显示自定义Toast,并防止Toast的重复显示。 五、总结 在本文中,我们介绍了如何自定义Toast样式,并防止Toast的重复显示。自定义Toast可以让我们的应用更加符合自己的设计风格,从而提高用户体验。而防止Toast的重复显示可以避免用户的困扰,增强应用的健壮性。                            如果你喜欢我们三七知识分享网站的文章,
欢迎您分享或收藏知识分享网站文章
欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
                        
 
                 
                ![最新版TikTok 抖音国际版解锁版 v33.8.4 去广告 免拔卡[免费网盘]](https://m.ynyuzhu.com/uploads/20240316/368374f292fe1b61eead785c71e11147.jpg) 
                
发表评论 取消回复