Android 自定义Toast

发布于:2025-08-16 ⋅ 阅读:(11) ⋅ 点赞:(0)

一、背景

自定义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>


网站公告

今日签到

点亮在社区的每一天
去签到