一、背景
自定义Toast背景、布局、显示时长、位置、图标等,根据需要调用。如:纯文本的Toast、包含文本和icon的Toast
二、代码实现
ToastUtil.kt
package com.vc.psclient.utils
import 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_SHORT
companion object {
private var toastUtilInstance: ToastUtil? = null
get() {
if (null == field) {
field = ToastUtil()
}
return field
}
@Synchronized
fun 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 = message
if(iconResId!=null){
val iv=view.findViewById<ImageView>(R.id.iv_icon)
iv.visibility=View.VISIBLE
iv.setImageResource(iconResId)
}
mToast!!.view=view
mToast!!.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"
>
<LinearLayout
android: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"
>
<View
android:layout_width="@dimen/dp_8"
android:layout_height="@dimen/dp_3"
/>
<ImageView
android: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"
/>
<TextView
android: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>