Android自定义Dialog

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,留言评论吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值