通过构造者模式做一个通用的自定义dialog弹窗

app开发肯定少不了各种样式的弹窗,这里分享一个自己一直在用的自定义dialog弹窗,简化了创建dialog里重复操作。

先上代码

public class CustomDialog extends Dialog {

    private MyDialogListener listener;//外部设置的监听回调
    private int dialogId = -1;//通过dialogId 区分同一页面多个弹窗
    private DialogOnClickListener onClickListener = new DialogOnClickListener();//implements实现View.OnClickListener
    private ViewGroup contentView;//dialog的布局对象

    public CustomDialog(Context context) {
        super(context);
    }

    public CustomDialog(@NonNull Context context, @StyleRes int themeResId) {
        super(context, themeResId);
    }

    public void setTextViewText(int id, String text) {
        TextView tv = contentView.findViewById(id);
        if (tv != null)
            tv.setText(text);
    }

    public void setTextViewSize(int id, int size) {
        TextView tv = contentView.findViewById(id);
        if (tv != null)
            tv.setTextSize(size);
    }

    public void setTextViewText(int id, SpannableString text) {
        TextView tv = contentView.findViewById(id);
        if (tv != null)
            tv.setText(text);
    }

    public void setTvLineSpacing(int id, int dp) {
        TextView tv = contentView.findViewById(id);
        if (tv != null)
            tv.setLineSpacing(dp, 1);
    }

    public void setImageView(int id, int resId) {
        ImageView iv = contentView.findViewById(id);
        iv.setImageResource(resId);
    }

    public void setTextColor(int id, int color) {
        TextView tv = contentView.findViewById(id);
        if (tv != null)
            tv.setTextColor(color);
    }

    public void setViewVisible(int id, int visible) {
        contentView.findViewById(id).setVisibility(visible);
    }

    public void setViewVisible(int id, boolean visible) {
        contentView.findViewById(id).setVisibility(visible ? View.VISIBLE : View.GONE);
    }

    public void setDialogId(int dialogId) {
        this.dialogId = dialogId;
    }

    private void setRootView(ViewGroup viewGroup) {
        this.contentView = viewGroup;
        setContentView(viewGroup);
    }


    /**
     * 遍历根布局  给每个有id的控件添加点击监听
     *
     * @param view
     */
    private void traverseParent(View view) {
        if (view instanceof ViewGroup) {
            if (view instanceof ViewPager) {
                if (view.getId() != -1) {
                    addViewClick(view);
                }
            } else {
                for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                    if (((ViewGroup) view).getChildAt(i).getId() != -1) {
                        addViewClick(((ViewGroup) view).getChildAt(i));
                    }
                    if (((ViewGroup) view).getChildAt(i) instanceof ViewGroup) {
                        traverseParent(((ViewGroup) view).getChildAt(i));
                    }
                }
            }
        } else {
            if (view.getId() != -1) {
                addViewClick(view);
            }
        }
    }

    public View findViewById(int id) {
        return contentView.findViewById(id);
    }

    private void addViewClick(View view) {
        view.setOnClickListener(onClickListener);
    }

    public int getDialogId() {
        return dialogId;
    }

    /**
     * dialog的按钮监听回调
     */
    public interface MyDialogListener {
        void onClick(View view, int dialogId, CustomDialog dialog);
    }

    public void setDialogListener(MyDialogListener listener) {
        this.listener = listener;
    }

    private class DialogOnClickListener implements View.OnClickListener {

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值