Android中经常会需要使用到Dialog,但是每个项目的Dialog样式也就那么几种,那么我们完全可以仿AlertDialog自定义符合自己需求的Dialog。不仅能学习源码的设计模式,又能快速完成项目需求,真是一举数得呀!废话不多说,切入正题吧!
AlertDialog的简单使用如下:
private void showDeleteDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setMessage("确认删除?")
.setCancelable(true)
.setPositiveButton("确认", (dialog, which) -> {
//确认删除的逻辑代码
delete();
dialog.dismiss();
})
.setNegativeButton("取消", (dialog, which) -> dialog.dismiss());
AlertDialog alertDialog = builder.create();
alertDialog.show();
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.color_E8340C));
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.color_3D3D3D));
}
分析:AlertDialog是通过builder.create()创建的,在AlertDialog.Builder设置了一些相关属性,例如:标题、内容、按钮等...
点击AlertDialog.Builder查看源码,只有两个属性,瞬间是不是就懵逼了!其实它只是又做了一次封装,将所有的参数放到了 AlertParams里面,在构造方法里面去创建了AlertParams对象,再通过这个对象去设置属性。分析完了,那我们开始依葫芦画瓢呗!
//配置参数的类
public class LoadingDialogConfig {
public Context context;
public String msg;
public int textColor;
public int textSize;
}
//自定义Dialog类
public class LoadingDialog extends Dialog { private Buidler buidler; private LoadingDialog(Context context, Buidler buidler) { super(context); this.buidler = buidler; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View v = View.inflate(buidler.context, R.layout.layout_loading_dialog, null);
setContentView(v); TextView tvContent = v.findViewById(R.id.tvContent); if (buidler.getMsg() != null) { tvContent.setText(buidler.getMsg()); } if (buidler.getTextSize() != 0) { tvContent.setTextSize(buidler.getTextSize()); } if (buidler.getTextColor() != 0) { tvContent.setTextColor(buidler.getTextColor()); } } public static class Buidler { LoadingDialogConfig loadingDialogConfig = new LoadingDialogConfig(); public Buidler(Context context) { loadingDialogConfig.context = context; } public Buidler setTextSize(int size) { loadingDialogConfig.textSize = size; return this; } int getTextSize() { return loadingDialogConfig.textSize; } public Buidler setTextColor(int color) { loadingDialogConfig.textColor = color; return this; } int getTextColor() { return loadingDialogConfig.textColor; } public Buidler setMsg(String msg) { loadingDialogConfig.msg = msg; return this; } String getMsg() { return loadingDialogConfig.msg; } public LoadingDialog create() { return new LoadingDialog(loadingDialogConfig.context, this); } } }
下面是使用:
val dialog: LoadingDialog = LoadingDialog.Buidler(this)
.setMsg("加载中.............")
.setTextSize(50)
.setTextColor(resources.getColor(R.color.colorPrimaryDark))
.create()
dialog.show()
这里我只是写了一个简单的Demo,帮大家分析Android源码。谢谢大家阅读,如果需要更多简单的分析源码的Demo,留言评论吧!