【Android】创建一个可以一直显示但是又不影响用户页面操作的Dialog

需求

此Dialog作为通知类型的dialog,当某事件被触发的时候,显示此Dialog,在dialog显示的时候,用户仍然可以正常操作页面,点击事件等不会被此dialog拦截。

实现

首先创建一个布局文件:这个根据自己需求创建(代码省略)

文件命名为【layout_notification_always_show】

创建dialog

kotlin 复制代码
class NotificationAlwaysShow(private val mContext: Context)
    : INotificationDialog {

    private var mDialog: Dialog? = null
    private var mTopTitle = mContext.getString(R.string.notification_caution)
    private var mBottomMessage = mContext.getString(R.string.notification_caution_message)
    private var mImage = R.drawable.ic_back_up

    /**
     * 设置图片
     */
    fun setImage(res: Int): NotificationAlwaysShow {
        mImage = res
        return this
    }

    /**
     * 设置提示Title
     */
    fun setTitle(title: Int): NotificationAlwaysShow {
        mTopTitle = mContext.getString(title)
        return this
    }

    /**
     * 设置详细提示信息
     */
    fun setMessage(message: Int): NotificationAlwaysShow {
        mBottomMessage = mContext.getString(message)
        return this
    }

    override fun show() {
        mDialog = Dialog(mContext)
        mDialog?.setContentView(R.layout.layout_notification_always_show)
        mDialog?.setCancelable(false)
        mDialog?.setCanceledOnTouchOutside(false)

        val window = mDialog?.window
        val layoutParams = window?.attributes
        layoutParams?.gravity = Gravity.TOP
        //通过设置Flag来实现我们的需求
        layoutParams?.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
        layoutParams?.y = mContext.resources.getDimensionPixelSize(R.dimen.notification_top_width)
        window?.attributes = layoutParams
        window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
        window?.setDimAmount(0f)
        window?.setWindowAnimations(R.style.Notification_dialog_animation)

        val ivImage = mDialog?.findViewById<ImageView>(R.id.iv_iamge_always_show)
        val textTitle = mDialog?.findViewById<TextView>(R.id.tv_title_always_show)
        val textMessage = mDialog?.findViewById<TextView>(R.id.tv_message_always_show)

        ivImage?.setImageResource(mImage)
        textTitle?.text = mTopTitle
        textMessage?.text = mBottomMessage

        // 设置按键监听器,拦截返回键事件
//        mDialog?.setOnKeyListener(object : DialogInterface.OnKeyListener {
//            override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean {
//                if (keyCode == KeyEvent.KEYCODE_BACK && event?.action == KeyEvent.ACTION_UP) {
//                    return true
//                }
//                return false
//            }
//        })

        mDialog?.show()
    }

    override fun dismiss() {
        mDialog?.dismiss()
    }

    override fun showing(): Boolean {
        return mDialog?.isShowing == true
    }

}
相关推荐
VidDown12 分钟前
显卡处理视频技术详解:从硬解码到 NVENC,GPU 如何让视频处理起飞?
javascript·编辑器·音视频·视频编解码·视频
重生之后端学习27 分钟前
Java入门
java·开发语言·职场和发展
碧海蓝天202232 分钟前
C++法则24:在标准 C++ 中,没有任何可移植的方式判断指针 T* pt 指向的内存位置是否已经 构造了对象,程序员必须手动跟踪哪些元素已构造。
java·开发语言·c++
代码不加糖39 分钟前
Proxy能够监听到对象中的对象的引用吗?
开发语言·前端·javascript
charlie1145141911 小时前
现代C++指南:Lambda,让我们用另一种方式持有函数
开发语言·c++
大家的林语冰1 小时前
连 Markdown 都不放过,Rust 在前端基建杀疯了,万物皆可“锈化“!
前端·javascript·markdown
想吃火锅10051 小时前
【前端手撕】instanceof
前端·javascript·原型模式
один but you1 小时前
const和constexpr常量表达式
java·前端·javascript
qq3621967051 小时前
阿里裁员新消息(2026最新动态汇总)
java·开发语言·前端
.千余1 小时前
【C++】模板进阶全解:非类型参数|全特化|偏特化|分离编译完全指南
开发语言·c++·笔记·学习·其他