Android笔记(二十七):自定义Dialog实现居中Toast

背景

记录实现符合项目需求的Toast弹窗

具体实现

kotlin 复制代码
class MyTipDialog private constructor(val context: Activity): Dialog(context, R.style.MyTipTheme) {

    val resId = ObservableField(0)
    private val mainHandler = Handler(Looper.getMainLooper())
    init {
        setCanceledOnTouchOutside(true)
        setCancelable(true)
        window?.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
        window?.setBackgroundDrawableResource(Color.parseColor("#00000000"))
        window?.setWindowAnimations(R.style.myTipDialogAnim)
        val binding = DataBindingUtil.inflate<MyTipsBinding>(layoutInflater, R.layout.my_tips, null, false)
        binding.viewModel = this
        setContentView(binding.root)
    }

    companion object{
        private var instance: MyTipDialog ? = null
        fun getInstance(context: Activity, resId: Int): MyTipDialog {
            if (instance == null){
                instance = MyTipDialog (context)
            }
            instance?.dismiss()
            instance?.resId?.set(resId)
            return instance!!
        }
    }

    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        context.dispatchTouchEvent(ev)
        return super.dispatchTouchEvent(ev)
    }

    override fun show() {
        super.show()
        mainHandler.postDelayed({
            dismiss()
        }, 2000)
    }

    override fun dismiss() {
        super.dismiss()
        mainHandler.removeCallbacksAndMessages(null)
    }
}

自定义布局:R.layout.my_tips

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="viewModel"
            type="com.masked_boy.test.MyTipsDialog" />
    </data>

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxWidth="304dp"
            android:paddingHorizontal="20dp"
            android:paddingVertical="5dp"
            android:layout_gravity="center"
            android:text="@{context.getString(viewModel.resId)}"
            android:textSize="11sp"
            android:textColor="#FFFFFFFF"
            android:background="#000000"/>
    </FrameLayout>
</layout>

对话框style

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
    <style name="MyTipTheme" parent="AppTheme">
        <item name="android:windowFullscreen">false</item>
        <item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
    </style>
    <style name="myTipDialogAnim" mce_bogus="1" parent="android:Animation">
        <item name="android:windowEnterAnimation">@anim/my_tip_dialog_enter_anim</item>
        <item name="android:windowExitAnimation">@anim/my_tip_dialog_exit_anim</item>
    </style>
</resources>

对话框show动画R.anim.my_tip_dialog_enter_anim

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:interpolator="@android:anim/decelerate_interpolator">
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1" />
</set>

对话框dismiss动画R.anim.my_tip_dialog_exit_anim

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:interpolator="@android:anim/decelerate_interpolator">
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0" />
</set>
相关推荐
恋猫de小郭3 分钟前
Flutter PC 多窗口最新进展,底层原生窗口句柄支持已合并
android·前端·flutter
摩西蒙8 分钟前
软考计算机组成原理学习笔记-1
笔记·学习·软件工程
中屹指纹浏览器14 分钟前
2026指纹浏览器性能优化实战:多环境并发与资源占用管控技术
经验分享·笔记
sp4229 分钟前
NativeScript 的 Jetpack Compose 入门指南
android·android jetpack
用户693717500138429 分钟前
AI来了,同事们的效率为什么差这么多?
android·前端·ai编程
凡小烦30 分钟前
从定制化页签tab到compose列表使用
android·前端
雾喔32 分钟前
【学习笔记2】快速上手调用 AI API & Prompt Engineering
人工智能·笔记·学习
kekegdsz1 小时前
高丢包、高延迟、断网秒切:开源一个 Android 弱网测试利器
android·测试
StarShip1 小时前
JVM堆栈溢出监测原理
android·java
Ehtan_Zheng1 小时前
ArrayDeque 是 Kotlin 开发者工具箱中一个被低估的集合类
android