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>
相关推荐
祭の2 小时前
什是服务器器和Apache Tomcat介绍(笔记)
运维·服务器·笔记
坚硬果壳_2 小时前
《硬件架构的艺术》笔记(二):时钟与复位
笔记·硬件架构
.生产的驴2 小时前
Docker 部署Nacos 单机部署 MYSQL数据持久化
android·运维·spring boot·sql·mysql·docker·容器
猫爪笔记3 小时前
MySQL数据库:SQL语言入门 【2】(学习笔记)
数据库·笔记·sql·学习·mysql
找藉口是失败者的习惯4 小时前
Android adb 指令大全
android·adb
初学者-Study4 小时前
Android Osmdroid + 天地图 (二)
android·osmdroid地图点击·定位监听·marker配置
喜欢踢足球的老罗4 小时前
RN开发搬砖经验之—React Native(RN)应用转原生化-Android 平台
android·react native·react.js
红米饭配南瓜汤4 小时前
Android Binder通信02 - 驱动分析 - 架构介绍
android·架构·binder
️ 邪神5 小时前
【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页
android·flutter·ios·鸿蒙·reactnative
挥剑决浮云 -5 小时前
Linux 网络编程
linux·运维·c语言·网络·笔记