本文会不定期更新,推荐watch下项目。
如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request。
本文的示例代码主要是基于EasyDialog这个库编写的,若你有其他的技巧和方法可以参与进来一起完善这篇文章。
本文固定连接:https://github.com/tianzhijiexian/Android-Best-Practices
背景
正确的做法是AlertDialog被DialogFragment管理,DialogFragment被FragmentManager管理,这样才是真正的面向对象的封装方式,代码自然也会干净很多。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("我是标题")
.setMessage(getResources().getString(R.string.hello_world))
.setPositiveButton("我同意", this)
.setNegativeButton("不同意", this)
.setCancelable(false);
//.show(); // show cann't be use here
return builder.create();
}
如果你要做自定义的dialog,那么直接通过setView就能做到:
builder.setView(view) // 设置自定义view
这样的话他们的职责就很明确了:
- fragmentManager管理fragment的生命周期和activity的绑定关系
- dialogFragment来处理各种事件(onDismiss等)和接收外部传参(bundle)
- alertDialog负责dialog的内容和样式的展示
public class MyDialog extends DialogFragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
// ...
// 得到各种配置参数
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// 根据得到的参数,建立一个dialog
return new AlertDialog.Builder(getActivity())
.setMessage("message")
.create();
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
// 处理响应事件
}
}
至此,dialog三部曲就已经完成:
- 在onCreate中拿到外部传入的参数
- 在onCreateDialog中构建一个alertDialog对象
- 通过DialogFragment的
show()
来显示对话框
理解DialogFragment的方法调用
因为fragment本身就是一个复杂的管理器,而且很多开发者对于dialogFragment中的各种回调方法会产生理解上的偏差,所以我做了下面的图示:
微博:@天之界线2010
网友评论