Android 自定义Toast
一、背景
自定义Toast背景、布局、显示时长、位置、图标等,根据需要调用。如:纯文本的Toast、包含文本和icon的Toast
二、代码实现
ToastUtil.kt
package com.vc.psclient.utilsimport android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.annotation.DrawableRes
import com.vc.psclient.PsClientApplication
import com.vc.psclient.R/*** @Description : ToastUtil*/
class ToastUtil {private var mToast: Toast?=null// 默认显示时长private val DEFAULT_DURATION = Toast.LENGTH_SHORTcompanion object {private var toastUtilInstance: ToastUtil? = nullget() {if (null == field) {field = ToastUtil()}return field}@Synchronizedfun getInstance(): ToastUtil {return toastUtilInstance!!}}/*** 显示自定义Toast* @param message 显示的消息* @param iconResId 图标资源ID (可选)* @param duration 显示时长 (Toast.LENGTH_SHORT 或 Toast.LENGTH_LONG)* @param gravity 显示位置 (Gravity.CENTER, Gravity.TOP 等)* @param xOffset x轴偏移量* @param yOffset y轴偏移量*/fun showToast(message: String,@DrawableRes iconResId: Int?=null,duration: Int = DEFAULT_DURATION,gravity: Int = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL,xOffset: Int = 0,yOffset: Int = 100,){cancelToast()mToast = Toast.makeText(PsClientApplication.instance, "", duration)// 设置位置mToast!!.setGravity(gravity, xOffset, yOffset)val view= LayoutInflater.from(PsClientApplication.instance).inflate(R.layout.layout_toast, null)val textView=view.findViewById<TextView>(R.id.tv_msg)textView.text = messageif(iconResId!=null){val iv=view.findViewById<ImageView>(R.id.iv_icon)iv.visibility=View.VISIBLEiv.setImageResource(iconResId)}mToast!!.view=viewmToast!!.show()}private fun cancelToast(){if(mToast!=null){mToast!!.cancel()mToast=null}}
}
布局文件
layout_toast.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_horizontal"android:orientation="horizontal"android:minWidth="@dimen/dp_162"android:minHeight="@dimen/dp_40"android:layout_marginStart="@dimen/dp_30"android:layout_marginEnd="@dimen/dp_30"android:background="@drawable/toast_bg"><Viewandroid:layout_width="@dimen/dp_8"android:layout_height="@dimen/dp_3"/><ImageViewandroid:id="@+id/iv_icon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginEnd="@dimen/dp_3"android:visibility="gone"/><TextViewandroid:id="@+id/tv_msg"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center_horizontal"android:textSize="@dimen/sp_12"android:textColor="#ffeaecef"android:maxLines="2"android:ellipsize="end"android:layout_marginEnd="@dimen/dp_8"/></LinearLayout></FrameLayout>
toast_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><corners android:radius="@dimen/dp_8" /><solid android:color="#b3000000" />
</shape>