Android 安卓技术分享android开发Android

Dialog最佳实践

2017-07-05  本文已影响6487人  天之界线2010

本文会不定期更新,推荐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

这样的话他们的职责就很明确了:

  1. fragmentManager管理fragment的生命周期和activity的绑定关系
  2. dialogFragment来处理各种事件(onDismiss等)和接收外部传参(bundle)
  3. 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三部曲就已经完成:

  1. 在onCreate中拿到外部传入的参数
  2. 在onCreateDialog中构建一个alertDialog对象
  3. 通过DialogFragment的show()来显示对话框

理解DialogFragment的方法调用

因为fragment本身就是一个复杂的管理器,而且很多开发者对于dialogFragment中的各种回调方法会产生理解上的偏差,所以我做了下面的图示:

微博:@天之界线2010

参考文章:

上一篇 下一篇

猜你喜欢

热点阅读