最近在重构项目代码,项目中创建对话框用的是Dialog,AlertDialog。但是官方推出了DialogFragment来代替Dialog。那我就去认真的了解下DialogFragment。
DialogFragment
DialogFragment是在Android3.0的时候被引入的,从其名字可以很直观的看出它是一种基于Fragment的Dialog,可以用来创建对话框,它是用来替代Dialog的。一个新事物的出现是为了解决旧事物存在的问题,那不建议使用的Dialog存在什么问题呢?下面简单的说下。
Dialog存在问题:
- 在手机配置发生变化后(比如:旋屏后),变化之前显示的Dialog,变化之后不会显示,更别提Dialog状态的恢复了。
- 管理自定义的Dialog和系统原生的Dialog麻烦
DialogFragment怎么解决Dialog存在的问题:
- DialogFragment说到底还是一个Fragment,因此它继承了Fragment的所有特性。同理FragmentManager会管理DialogFragment。在手机配置发生变化的时候,FragmentManager可以负责现场的恢复工作。调用DialogFragment的setArguments(bundle)方法进行数据的设置,可以保证DialogFragment的数据也能恢复。
- DialogFragment里的onCreateView和onCreateDIalog 2个方法,onCreateView可以用来创建自定义Dialog,onCreateDIalog 可以用Dialog来创建系统原生Dialog。可以在一个类中管理2种不同的dialog。
用DialogFragment替代Dialog
既然DialogFragment有这些好处,那我就毅然决然的对项目中的Dialog用DialogFragment来进行替代。
重构的思路是这样的:
- 首先先创建一个ConfirmDialogFragment类(该类是用来创建确认对话框的),ConfirmDialogFragment类继承了DialogFragment。
- 其次在创建一个ProgressDialogFragment类(该类是用来创建进度对话框),同时它也继承了DialogFragment。
- 其他类型的Dialog就不举例了。
- 最后在BaseActivity(项目中所有Activity的基类)添加显示Dialog的方法,供BaseActivity的子类、Fragment、还有非Activity和非Fragment的类来调用。
我们先看下关键代码片段:代码地址
ConfirmDialogFragment中的代码片段:代码地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
/** *用来创建确认对话框 * Created by niuxiaowei on 2015/10/16. */ public class ConfirmDialogFragment extends DialogFragment{ private ConfirmDialogListener mListener; //对外开放的接口 public static interface ConfirmDialogListener extends DialogInterface.OnClickListener{ } /** * @param title * @param message * @param cancelable * @return */ public static ConfirmDialogFragment newInstance(String title, String message,boolean cancelable){ ConfirmDialogFragment instance = new ConfirmDialogFragment(); Bundle args = new Bundle(); args.putString("title",title); args.putString("message",message); args.putBoolean("cancelable",cancelable); instance.setArguments(args); return instance; } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { 创建ConfirmDialog核心代码,可以下载源代码查看..... } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (getActivity() instanceof ConfirmDialogListener ) { mListener= (ConfirmDialogListener ) getActivity(); } } ...... } |
ConfirmDialogFragment很关键的一点,ConfirmDialogFragment中的mListener属性的值是通过
1 2 3 4 5 6 7 |
@Override public void onAttach(Activity activity) { super.onAttach(activity); if (getActivity() instanceof ConfirmDialogListener ) { mListener= (ConfirmDialogListener ) getActivity(); } } |
方式获取的。
BaseActivity中代码片段:代码地址