Dialog最佳实践

作者: 天之界线2010 | 来源:发表于2017-07-05 20:49 被阅读6487次

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

    参考文章:

    相关文章

      网友评论

      • sugaryaruan:又看了一遍,依然有新的收获,感谢分享
      • 光头强_Mr:源码在哪里下载啊?????????
      • 小新哥的大梦想:写的不错,赞一个:+1:
      • madroid:文章中的配图很漂亮请教一下这是用什么工具画的
      • b7049184a113:博主写的文章都很有价值.
      • 80e9867bb05d:AlertController是私有的,不能访问呀?????
      • 学点东西吧6:最喜欢看这种慢慢分析,一步步实践的文章,让读者也能跟着一步步去实践,感谢楼主分享

      本文标题: Dialog最佳实践

      本文链接:https://www.haomeiwen.com/subject/rfnubttx.html