【Android】BottomSheetDialogFragment使用笔记

一、简介

BottomSheetDialogFragment继承自DialogFragment,它的内部创建了一个BottomSheetDialog,它可以通过拖动来实现展开 / 收缩的效果,其默认是在底部弹出。


二、BottomSheetDialogFragment的使用

在项目中,我定义了一个BaseBottomSheetDialogFragment基类,用来进行一些基础通过设置。
在使用过程中发现,如果是使用ConstraintLayout 约束布局,则必须通过onCreateDialog方法来进行BottomSheetDialog的创建且为其指定样式,否则会出现高度失常的现象,这个具体原因待项目完成查询具体原因后更新。

BaseBottomSheetDialogFragment.kt源码如下:

abstract class BaseBottomDialog<VB : ViewBinding> : BottomSheetDialogFragment() {
    protected var mViewBinding: VB? = null

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
        dialog.behavior.isDraggable = false  // 设置禁止拖拽
        return dialog
    }

    override fun onStart() {
        super.onStart()
        dialog?.run {
            setCanceledOnTouchOutside(false)
            setCancelable(false)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        mViewBinding = getViewBinding(inflater, container)
        return mViewBinding?.root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        mViewBinding = null
    }

    protected abstract fun getViewBinding(
        inflater: LayoutInflater,
        container: ViewGroup?
    ): VB
}

三、BottomSheetDialogFragment去除系统默认的背景色

有时候,我们需要为底部弹窗实现圆角背景,但运行后总是发现实际效果并不匹配,后来经排查得知,是BottomSheetDialogFragment的根布局FrameLayout上设置了style="?attr/bottomSheetStyle"所致。那么我们只需要在代码onStart中,添加如下代码即可去除/修改默认的背景色,这里是直接将默认颜色修改为了透明色:

    override fun onStart() {
        super.onStart()
        dialog?.run {
            // 取消默认的背景色
            try {
                // hack bg color of the BottomSheetDialog
                val parent = view!!.parent as ViewGroup
                parent.setBackgroundResource(R.color.transparent)
            } catch (e: Exception) {
                e.printStackTrace()
            }
            ...
        }
    }

参考自用BottomSheetDialog作为底部弹出窗时,去除默认背景色或自定义背景色


四、拓展阅读

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容