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>
相关推荐
00后程序员张4 分钟前
详细解析苹果iOS应用上架到App Store的完整步骤与指南
android·ios·小程序·https·uni-app·iphone·webview
周周记笔记1 小时前
学习笔记:第一个Python程序
笔记·学习
丑小鸭是白天鹅1 小时前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin
潘达斯奈基~1 小时前
《大数据之路1》笔记2:数据模型
大数据·笔记
程序员江同学1 小时前
ovCompose + AI 开发跨三端的 Now in Kotlin App
android·kotlin·harmonyos
..过云雨1 小时前
05.【Linux系统编程】进程(冯诺依曼体系结构、进程概念、进程状态(注意僵尸和孤儿)、进程优先级、进程切换和调度)
linux·笔记·学习
2501_915106321 小时前
Xcode 上传 ipa 全流程详解 App Store 上架流程、uni-app 生成 ipa 文件上传与审核指南
android·macos·ios·小程序·uni-app·iphone·xcode
消失的旧时光-19432 小时前
Kotlinx.serialization 使用讲解
android·数据结构·android jetpack
咸甜适中2 小时前
rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片
笔记·学习·rust·egui