一、简介
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()
}
...
}
}