自定义dialog

自定义对话框实现

项目中我们或多或少会自己自定义一个dialog,具体如何自定义对话框呢?以下将一步一步指导你实现一个简单的对话框。

1、首先新增一个CustomDialog的类继承Dialog 如下

自定义dialog

2、继承后重写它的三个方法

public CustomDialog(Builder builder) {
    super(builder.context);
    context = builder.context;
    cancelTouchout = builder.cancelTouchout;
    view = builder.view;
}

public CustomDialog(Builder builder, int themeResId) {
    super(builder.context, themeResId);
    context = builder.context;
    cancelTouchout = builder.cancelTouchout;
    view = builder.view;

}

protected CustomDialog(Builder builder, boolean cancelable, @Nullable OnCancelListener cancelListener) {
    super(builder.context, cancelable, cancelListener);
}

3、我们可以通过Builder向对话框传入所需要的参数

public static final class Builder {
    private Context context;
    private boolean cancelTouchout;
    private View view;
    private int resStyle = -1;
    public Builder(Context context) {
        this.context = context;
    }

    public Builder view(int resView) {
        view = LayoutInflater.from(context).inflate(resView, null);
        return this;
    }

    public Builder style(int resStyle) {
        this.resStyle = resStyle;
        return this;
    }

    public Builder cancelTouchout(boolean val) {
        cancelTouchout = val;
        return this;
    }

    public Builder addViewOnclick(int viewRes,View.OnClickListener listener){
        view.findViewById(viewRes).setOnClickListener(listener);
        return this;
    }


    public CustomDialog build() {
        if (resStyle != -1) {
            return new CustomDialog(this, resStyle);
        } else {
            return new CustomDialog(this);
        }
    }
}

4、接着我们重写对话框的onCreate方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(view);
    setCanceledOnTouchOutside(cancelTouchout);

}

5.最后我们就可以在activity开启对话框 如下方式调用

CustomDialog.Builder builder = new CustomDialog.Builder(this);

dialog= builder.cancelTouchout(false)
                .view(R.layout.dialog_login)
                .style(R.style.Dialog)
        .addViewOnclick(R.id.btn_ok, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        })
        .addViewOnclick(R.id.btn_cancel, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        })
        .build();
dialog.show();

6、运行效果图

自定义dialog

完整代码

public class CustomDialog extends Dialog {
    private Context context;
    private boolean cancelTouchout;
    private View view;
    public CustomDialog(Builder builder) {
        super(builder.context);
        context = builder.context;
        cancelTouchout = builder.cancelTouchout;
        view = builder.view;
    }

    public CustomDialog(Builder builder, int themeResId) {
        super(builder.context, themeResId);
        context = builder.context;
        cancelTouchout = builder.cancelTouchout;
        view = builder.view;

    }

    protected CustomDialog(Builder builder, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(builder.context, cancelable, cancelListener);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(view);
        setCanceledOnTouchOutside(cancelTouchout);

    }
    public static final class Builder {
        private Context context;
        private boolean cancelTouchout;
        private View view;
        private int resStyle = -1;
        public Builder(Context context) {
            this.context = context;
        }

        public Builder view(int resView) {
            view = LayoutInflater.from(context).inflate(resView, null);
            return this;
        }

        public Builder style(int resStyle) {
            this.resStyle = resStyle;
            return this;
        }

        public Builder cancelTouchout(boolean val) {
            cancelTouchout = val;
            return this;
        }

        public Builder addViewOnclick(int viewRes,View.OnClickListener listener){
            view.findViewById(viewRes).setOnClickListener(listener);
            return this;
        }


        public CustomDialog build() {
            if (resStyle != -1) {
                return new CustomDialog(this, resStyle);
            } else {
                return new CustomDialog(this);
            }
        }
    }
}