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

一、前言

在开发安卓应用时,我们可能需要使用Toast来提示用户一些消息。但是默认的Toast样式可能无法满足我们的需求,比如Toast的背景色、字体大小、显示时间等。此外,由于Toast的弹出过程较为频繁,可能会造成Toast的重复显示,给用户带来麻烦。因此,在这篇文章中,我们将介绍如何自定义Toast样式,并防止Toast的重复显示。

二、自定义Toast样式

首先,我们需要创建一个布局文件,来定义我们所需的样式。例如,下面是一个简单的自定义布局文件`toast_custom.xml`:

```xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/toast_bg"

android:orientation="horizontal"

android:padding="10dp">

android:id="@+id/iv_icon"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:paddingEnd="10dp"

android:paddingRight="10dp"

android:src="@drawable/ic_info" />

android:id="@+id/tv_message"

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 sToastMap = new HashMap<>();

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.37seo.cn/

点赞(113) 打赏

评论列表 共有 0 条评论

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