1.Builder设计模式的特点
1)所有的set方法必须返回当前对象
2)连续调用
2.为什么这么设计?
1)节约资源
2)方便多次设置数据
3)方便组合不同的对象
4)不需要创建引用就可以set数据
OK,扯完了上面这些东西之后,我们来仿照系统源码,按照谷歌工程师的思路,自定义我们的dialog。这个自定义的dialog的步骤有三:
一,让MyCustomDialog继承Dialog;
二,需要提供两个静态内部类:Params和Builder。在Params中定义上下文context,标题文字title,消息内容message,确定按钮文本confirmText,取消按钮文本cancelText,确定按钮的监听onConfirmClickListener,取消按钮的监听onCancelClickListener。Builder类中,提供以上params的set方法,返回当前对象this。代码示例:
public Builder setTitle(String title){
params.title = title;
return this;
}
public Builder setMessage(String message){
params.message = message;
return this;
}
三,提供自定义dialog的创建方法create(),返回myCustomDialog。这个方法也分三个步骤:
1)首先我们的自定义dialog需要布局,写一个布局文件mycustom_dialog_layout,这里就自由发挥了,本文还是使用常规的dialog布局。类似下图:
加载布局:
View view = LayoutInflater.from(params.context).inflate(R.layout.mycustom_dialog_layout,null);
2)把params的东西都初始化一下,设置标题示例如下:
//设置标题
TextView titleTV = (TextView) view.findViewById(R.id.tv_title);
if (!TextUtils.isEmpty(params.title)){
titleTV.setText(params.title);
titleTV.setVisibility(View.VISIBLE);
}else{
titleTV.setVisibility(View.GONE);
}
其他的都可以画瓢式地码出来。
3)把视图绑定到dialog上。
myCustomerDialog.setContentView(view);
自定义的dialog到此就写好了。然后我们在MainActivity中,像使用AlertDialog一样使用它。
MyCustomerDialog.Builder builder = new MyCustomerDialog.Builder(this);
builder.setTitle("温馨提示").setMessage("你确定要退出吗?").setConfirmText("确定").setOnConfirmClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"已退出",Toast.LENGTH_LONG).show();
myCustomerDialog.dismiss();
}
}).setCancelText("取消").setOnCancelClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myCustomerDialog.dismiss();
}
});
myCustomerDialog = builder.create();
myCustomerDialog.show();
最后,在styles.xml中添加以下代码,去除边框。
<item name="android:windowFrame">@null</item>