android自定义Toast样式和显示方式

问题: 1.android 开发中如果不停的触发显示Toast,会造成Toast一个接一个的弹出,非常影响用户体验。 2.android设备有千万个,每个设备的Toast的背景有可能不一样,造成在应用内显示时造成显示不够清晰

在这里我封装了一个Toast工具类可以实现弹出下一个Toast时检查当前是否有显示Toast,有的话重用当前Toast,避免重复弹出。 可以自定义Toast显示的view,实现你想要的样式,实现领导的梦想!!!

Toast工具类

kotlin 复制代码
/**
 * Created by Aaron on 2019/07/18.
 *
 * 弹出toast提示工具类
 */
object ToastUtils {

    private var mToast: Toast? = null  //toast样式
    private val mMsg: String? = null  //上一次弹出的内容
    private var mToastView: ToastView? = null  //自定义view
    private var mToastGravity:Int = -1  //位置

    /**
     * 弹出提示
     * @param msg  提示信息
     * @param time  显示时间
     */
    fun showToast(msg: String?, time: Int, context: Context?) {
        if (mToast == null || mMsg != null && msg != mMsg) {
            mToast = Toast.makeText(context, msg, time)
            if (mToastView != null) {
                mToast!!.view = mToastView
                mToastView!!.setText(msg!!)
            } else {
                mToast!!.setText(msg)
            }
        } else {
            if (mToastView != null && mToast!!.view != mToastView) {
                mToast!!.view = mToastView
            }
            if (mToastView != null) {
                mToastView!!.setText(msg!!)
            } else {
                mToast!!.setText(msg)
            }
            mToast!!.duration = time
        }
        if (mToastGravity != -1) {
            mToast!!.setGravity(mToastGravity, 0, 0)
        }

        //不设置的话,最高显示到状态栏下面
        mToast!!.view.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        mToast!!.show()
    }

    /**
     * 弹出提示信息
     * @param msgId  提示信息id
     * @param time  显示时间
     */
    fun showToast(msgId: Int, time: Int, context: Context?) {
        showToast(context?.getString(msgId), time, context)
    }

    /**
     * 弹出短时间提示
     * @param msg  提示信息
     */
    fun showShortToast(msg: String, context: Context?) {
        showToast(msg, Toast.LENGTH_SHORT, context)
    }

    fun showShortToast(msgId:Int, context: Context?) {
        showToast(msgId, Toast.LENGTH_SHORT, context)
    }

    /**
     * 弹出长时间提示
     * @param msg  提示信息
     */
    fun showLongToast(msg: String, context: Context?) {
        showToast(msg, Toast.LENGTH_LONG, context)
    }

    /**
     * 关闭当前Toast
     */
    fun cancelCurrentToast() {
        if (mToast != null) {
            mToast!!.cancel()
        }
    }

    fun reToast(msg: String) {
        Toast.makeText(JblBaseApplication.sInstance, msg, Toast.LENGTH_SHORT).show()
    }

    fun reToast(msgId: Int) {
        Toast.makeText(JblBaseApplication.sInstance, msgId, Toast.LENGTH_SHORT).show()
    }

    fun setToastView(context: Context?) {
        mToastView = ToastView(context!!)
    }

    fun setToastGravity(gravity: Int) {
        mToastGravity = gravity
    }

    /**
     * 重置toast 信息
     */
    fun resetToast() {
        mToastView = null
        mToastGravity = -1
        mToast = null
    }
}

自定义view

kotlin 复制代码
/**
 * Created by Aaron on 2019-07-18.
 *
 * 自定义toast view
 */
class ToastView : FrameLayout {

    private var toastText: TextView? = null

    constructor(context: Context) : super(context) {

        init(context)
    }

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {

        init(context)
    }

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {

        init(context)
    }

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(
        context,
        attrs,
        defStyleAttr,
        defStyleRes
    ) {

        init(context)
    }

    private fun init(context: Context) {
        addView(View.inflate(context, R.layout.toast_view, null))
        toastText = findViewById(R.id.toastText)
    }

    fun setText(text: String) {
        toastText!!.text = text
    }

    fun setTextSize(size: Int) {
        toastText!!.textSize = size.toFloat()
    }

    fun setTextColor(color: Int) {
        toastText!!.setTextColor(color)
    }
}

自定义view layout

ini 复制代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#88000000">

    <TextView
            android:id="@+id/toastText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textColor="@color/text_color_white"
            android:textSize="30sp"
            android:paddingLeft="60dp"
            android:paddingTop="10dp"
            android:paddingRight="60dp"
            android:paddingBottom="10dp"
            tools:ignore="MissingConstraints"/>
</android.support.constraint.ConstraintLayout>
相关推荐
潘潘潘22 分钟前
Android多线程机制简介
android
CYRUS_STUDIO2 小时前
利用 Linux 信号机制(SIGTRAP)实现 Android 下的反调试
android·安全·逆向
CYRUS_STUDIO2 小时前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
黄林晴6 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我6 小时前
flutter 之真手势冲突处理
android·flutter
法的空间7 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止7 小时前
深入解析安卓 Handle 机制
android
恋猫de小郭7 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech7 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831677 小时前
为何Handler的postDelayed不适合精准定时任务?
android