高度比较高的自定义bottomsheetdialogfragment弹框在展示时可能会因为大于16:9 比例的关键线而收缩一些高度。提供两个方法来优化展示,使得弹框打开时就完全展示:
abstract class BaseBottomSheetDialogFragment : BottomSheetDialogFragment() {
override fun onStart() {
super.onStart()
showAllDialog2()
dialog?.window?.setDimAmount(0.4F)
view?.post {
val parent = view?.parent as View?
// 使背景透明,不然会展示出来下面的白色,使圆角效果受影响
parent?.setBackgroundColor(Color.TRANSPARENT)
}
}
/**
* 打开弹框时,全部展示弹框内容
*/
fun showAllDialog() {
view?.let {
val parent: View = it.parent as View
val behavior = BottomSheetBehavior.from(parent)
//方法1: 初始为展开状态,打开弹框可以全部展示
// 但是比较高弹框(高度大于16:9关键线),轻轻下拉会收缩到peekHeight窥视高度,而不是直接隐藏
behavior.setState(BottomSheetBehavior.STATE_EXPANDED)
}
}
/**
* 打开弹框时,全部展示弹框内容
*/
fun showAllDialog2() {
view?.let {
val parent: View = it.parent as View
val behavior = BottomSheetBehavior.from(parent)
// 方法2:
it.post {
// 弹框默认状态为collapsed 折叠状态,
// 下面方法设置了折叠弹框高度,为dialog view的高度,则会全部展示的弹框,并且避免了下拉出现收缩到窥视高度的情况
behavior.peekHeight = it.measuredHeight
}
}
}
/**
* 重写show解决问题:Can not perform this action after onSaveInstanceState
*
* @param manager
* @param tag
*/
override fun show(manager: FragmentManager, tag: String?) {
try {
val c = Class.forName("androidx.fragment.app.DialogFragment")
val con = c.getConstructor()
val obj = con.newInstance()
val dismissed = c.getDeclaredField("mDismissed")
dismissed.isAccessible = true
dismissed[obj] = false
val shownByMe = c.getDeclaredField("mShownByMe")
shownByMe.isAccessible = true
shownByMe[obj] = true
} catch (e: Exception) {
e.printStackTrace()
}
val ft = manager.beginTransaction()
ft.add(this, tag)
ft.commitAllowingStateLoss()
}
override fun dismiss() {
dismissAllowingStateLoss()
}
}