DialogFragment的踩坑

第一个坑:如何修改dialogFragment的背景色。

val window: Window? = dialog?.window
val windowParams = window.attribute
设置背景阴影的透明度
windowParams.dimAmount = 0.3f

第二个坑:解决打开软键盘,dialogFragment上移问题。


 false

第三个坑:打开dialogFragment,退出到后台或者打开新页面,然后再返回的时候,dialogFragment会重新执行动画。
因为当dialogFragment不可见的时候,会重新执行动画,特别的不友好,赘余。
解决办法:
1、在onCreateView中给windown添加转场属性。这样DialogFragment就具有了转场动画效果。
2、在onStop中取消掉转场动画,这样DialogFragment就不再有转场动画效果。此时跳转到其他页面,在回到当前dialogfragment,由于Dialogfragment动画被取消,所以不会再次执行进场动画。
3、在onResume再次为DialogFragment设置转场动画。注意这里需要使用handler延时,因为Activity是在onResume执行之后,才将自身所在的Window添加到WindowManager中的,然后才会调用ViewRootImpl的setview方法才开始View绘制的,如果不使用延时,相当于此时又给DialogFragment设置了转场动画效果。那么我们在步骤2中onStop取消动画就没有意义了。因为从其他页面回到DialogFragment执行onResume后再去绘制页面的,此时如果直接在onResume设置DialogFragment的动画,那DialogFragment实际上就具有了转场动画属性,还是会再执行一次进场动画。所以这里使用一个handler延时来规避这个时间差。(在DialogFragment渲染完成后再设置DialogFragment的转场动画,就不会对步骤2造成干扰)。此时DialogFragment具有了转场动画,那么我们结束DialogFragment时,就会有退出动画了,刚好弥补掉注意点1。


 private val orientation: Int = R.style.BottomAnimBottom //弹出的动画

 override fun onStop() {
        super.onStop()
        if (dialog != null && dialog?.window != null) {
            dialog?.window?.setWindowAnimations(0)
        }
    }
private val handler: Handler = Handler()
    override fun onResume() {
        super.onResume()
        handler.postDelayed({
            if (dialog != null && dialog?.window != null) {
                dialog?.window?.setWindowAnimations(orientation)
            }
        },500)
    }

    override fun onDestroy() {
        super.onDestroy()
        handler.removeCallbacksAndMessages(null)
    }
 
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
   
        if (dialog != null && dialog?.window != null) {
            dialog?.window?.setWindowAnimations(orientation)
        }
        return view
    }

你可能感兴趣的:(DialogFragment的踩坑)