自定义dialog
自定义对话框实现
项目中我们或多或少会自己自定义一个dialog,具体如何自定义对话框呢?以下将一步一步指导你实现一个简单的对话框。
1、首先新增一个CustomDialog的类继承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、运行效果图
完整代码
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); } } } }