DialogFragment的踩坑
第一个坑:如何修改dialogFragment的背景色。
val window: Window? = dialog?.window
val windowParams = window.attribute
设置背景阴影的透明度
windowParams.dimAmount = 0.3f
第二个坑:解决打开软键盘,dialogFragment上移问题。
<!--这个属性设置为false可以防止输入法把弹窗顶上去-->
<item name="android:windowIsFloating">false</item>
第三个坑:打开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
}