DialogFragment意义
在Android里实现一个对话框一般有这几种方式:Dialog(继承重写Dialog实现一个自定义的Dialog)、AlertDialog(Android原生提供的对话框,底层是继承Dialog实现)、PopupWindow(用弹出悬浮框,实现对话框)。
它们与activity的生命周期不是捆绑的,后面google推荐使用DialogFragment来取代它们。DialogFragment本质是Fragment,有Fragment的生命周期并且与创建它的activity有捆绑,便于Activity更好的控制管理DialogFragment。
随屏幕旋转(横竖屏幕切换)DialogFragment对话框随之自动调整对话框大小。AlertDialog和PopupWindow随屏幕切换而消失,并且如果处理不当很可能引发异常。
DialogFragment的创建
以Dialog创建DialogFragment
类似如下代码:
1 |
|
在activity里显示对话框:
1 | MyDialog1 myDialog1 = new MyDialog1(); |
当然也可以使用自定义的布局来创建:
1 |
|
还有直接使用Dialog的方法:
1 |
|
以布局View创建DialogFragment
1 | public class MyDialog2 extends DialogFragment { |
DialogFragment的设置
宽高设置
DialogFragment在onCreate()和onCreateView()中设置布局大小无效,因为onCreate()和onCreateView()生命周期在onStart()生命周期之前,此时还未调用Dialog.show()方法,设置大小无效。所以要在onStart方法中设置大小:
1 | /** |
改变对话框的显示位置
改变对话框的显示位置,将对话框放到布局下面,也就是屏幕下方:
1 |
|
将对话框的宽或者高铺满屏幕
将对话框的宽或者高铺满屏幕,第一种方法需要在styles.xml文件里,添加一个没有内边距的style,如下:
1 | <style name="dialogFullScreen1" parent="Theme.AppCompat.Dialog"> |
第二种方法设置android:windowFullscreen属性:
1 | <style name="dialogFullScreen2" parent="Theme.AppCompat.Dialog"> |
如果在代码中设置高度也MATCH_PARENT,第一种会保留手机上的导航栏,而第二种会连导航栏都覆盖掉。
也可以在创建DialogFragment对话框的时候添加style,如下:
1 | MyDialog2 myDialog2 = new MyDialog2(); |
设置点击外部空白处不会关闭对话框
可以在styles中设置:
1 | <!-- 设置点击外部空白处不会关闭对话框--> |
也可以在代码中设置:
1 |
|
设置在弹出对话框后同时弹出软键盘
代码如下:
1 | public class MyDialog4 extends DialogFragment { |
效果如下:

在Fragment里启动对话框
与activity里一样,唯一的区别是如果打算依然用老套的onActivityResult来向下传值,那么就需要设置一个目标Fragment,在下面的代码里setTargetFragment()方法就是起到这个作用的,在下面的代码里我们用MyDialog5启动了MyDialog2:
1 | public class MyDialog5 extends DialogFragment { |
设置圆角
设置圆角失败,实际上是设置的背景图片被Dialog自带的背景遮盖了,导致圆角无法显示。所以设置一下透明背景就可以了。注意设置DecorView的背景与设置Window的背景是有区别的,设置Window的背景 与设置DecorView背景相比,该方法会将dialog自带的padding内边距去掉。
1 |
|
效果如下:
设置DecorView背景:
设置Window背景:
代码详见DialogTest
参考资料:
观心静 Android开发 DialogFragment对话框详解
他叫自己MR.张 Android 必知必会 - DialogFragment 使用总结
Yif DialogFragment 使用