自定義View-AlterDialog

自定義View-AlterDialog

在這裏插入圖片描述
UI有些醜,各位見諒啊🤣

自定義AlterDialog主要是自定義Builder

現在定義一個類繼承AlterDialog,這裏只是爲了給Builder提供一個外部類,其實只是自定義一個Builder也是可以的

public class FxAlterDialog extends AlertDialog {

    protected FxAlterDialog(@NonNull Context context) {
        this(context, 0);
    }

    protected FxAlterDialog(@NonNull Context context, int themeResId) {
        this(context, false, null);
    }

    protected FxAlterDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }
}


寫內部類Builder

public static class Builder extends AlertDialog.Builder {
        private View mContainerView;
        private Context mContext;
        private AlertDialog mDialog;
        private OnSuccessClickListener mOnSuccessClickListener;
        private OnFailClickListener mOnFailClickListener;
        private OnCancelClickListener mOnCancelClickListener;
        private Button btnSuccess;
        private Button btnFail;
        private Button btnCancel;
        private TextView mTvTitle;
        private TextView mTvMessage;
        private RelativeLayout mRlViewResult;
        private ImageView mIvResult;

        public final static int DEFAULT = -1;
        public final static int OK = 0;
        public final static int ERROR = 1;
        public final static int WARNING = 2;

        @IntDef({
                DEFAULT, OK, ERROR, WARNING
        })
        @Retention(RetentionPolicy.SOURCE)
        public @interface Result {
        }

        @Result
        int curResult = DEFAULT;

        public Builder setResult(@Result int result) {
            curResult = result;
            return this;
        }

        public Builder(Context context) {
            super(context);
            mContext = context;
            if (mContainerView == null) {
                mContainerView = LayoutInflater.from(mContext).inflate(R.layout.dialog_container_view, null);
            }
        }

        public Builder setSuccessButtonOnClick(CharSequence text, @NonNull OnSuccessClickListener listener) {
            mOnSuccessClickListener = listener;
            btnSuccess = mContainerView.findViewById(R.id.btn_success);
            btnSuccess.setVisibility(View.VISIBLE);
            btnSuccess.setText(text);
            btnSuccess.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mOnSuccessClickListener.onClick(mDialog);
                }
            });
            return this;
        }

        public Builder setFailButtonOnClick(CharSequence text, OnFailClickListener listener) {
            mOnFailClickListener = listener;
            btnFail = mContainerView.findViewById(R.id.btn_fail);
            btnFail.setVisibility(View.VISIBLE);
            btnFail.setText(text);
            btnFail.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mOnFailClickListener != null) {
                        mOnFailClickListener.onClick(mDialog);
                    }
                }
            });
            return this;
        }

        public Builder setCancelButtonOnClick(CharSequence text, OnCancelClickListener listener) {
            mOnCancelClickListener = listener;
            btnCancel = mContainerView.findViewById(R.id.btn_cancel);
            btnCancel.setVisibility(View.VISIBLE);
            btnCancel.setText(text);
            btnCancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mOnCancelClickListener != null) {
                        mOnCancelClickListener.onClick(mDialog);
                    }
                }
            });
            return this;
        }

        @Override
        public Builder setNegativeButton(CharSequence text, OnClickListener listener) {
            return this;
        }

        @Override
        public Builder setView(View view) {
            return this;
        }

        @Override
        public Builder setTitle(int titleId) {
            this.setTitle(mContext.getResources().getString(titleId));
            return this;
        }

        @Override
        public Builder setTitle(CharSequence s) {
            mTvTitle = mContainerView.findViewById(R.id.tv_title);
            mTvTitle.setVisibility(View.VISIBLE);
            mTvTitle.setText(s);
            return this;
        }

        @Override
        public Builder setMessage(int messageId) {
            this.setMessage(mContext.getResources().getString(messageId));
            return this;
        }

        @Override
        public Builder setMessage(@Nullable CharSequence message) {
            mTvMessage = mContainerView.findViewById(R.id.tv_message);
            mTvMessage.setVisibility(TextUtils.isEmpty(message) ? View.GONE : View.VISIBLE);
            mTvMessage.setText(message);
            return this;
        }

        public AlertDialog create() {
            mDialog = super.create();
            return mDialog;
        }

        public AlertDialog show() {
            initContentView();
            mDialog.show();
            return mDialog;
        }

        private void initContentView() {
            mDialog.setView(mContainerView);
            mRlViewResult = mContainerView.findViewById(R.id.rl_item1);
            mIvResult = mContainerView.findViewById(R.id.iv_result);
            switch (curResult) {
                case DEFAULT:
//                    mRlViewResult.setVisibility(View.VISIBLE);
//                    mRlViewResult.setBackground(null);
//                    mIvResult.setBackground(mContainerView.getResources().getDrawable(R.drawable.ic_circle));
//                    Animation annotation = AnimationUtils.loadAnimation(mContext, R.anim.rotate360);
//                    annotation.setInterpolator(new LinearInterpolator());
//                    annotation.setRepeatCount(-1);
//                    mIvResult.startAnimation(annotation);
                    break;
                case OK:
                    mTvTitle.setBackgroundColor(mContext.getResources().getColor(R.color.green));
                    mRlViewResult.setVisibility(View.VISIBLE);
                    mRlViewResult.setBackgroundColor(mContext.getResources().getColor(R.color.green));
                    mIvResult.setBackground(mContext.getResources().getDrawable(R.drawable.ic_success));
                    break;
                case ERROR:
                    mTvTitle.setBackgroundColor(mContext.getResources().getColor(R.color.red));
                    mRlViewResult.setVisibility(View.VISIBLE);
                    mRlViewResult.setBackgroundColor(mContext.getResources().getColor(R.color.red));
                    mIvResult.setBackground(mContext.getResources().getDrawable(R.drawable.ic_error));
                    break;
                case WARNING:
                    mTvTitle.setBackgroundColor(mContext.getResources().getColor(R.color.yellow));
                    mRlViewResult.setVisibility(View.VISIBLE);
                    mRlViewResult.setBackgroundColor(mContext.getResources().getColor(R.color.yellow));
                    mIvResult.setBackground(mContext.getResources().getDrawable(R.drawable.ic_warning));
            }
        }
    }

    public interface OnSuccessClickListener {
        void onClick(AlertDialog dialog);
    }

    public interface OnFailClickListener {
        void onClick(AlertDialog dialog);
    }

    public interface OnCancelClickListener {
        void onClick(AlertDialog dialog);
    }

重點在於下面幾個方法,爲了屏蔽以及重寫父類的方法,防止調這些方法時執行父類的方法內容

@Override
public Builder setNegativeButton(CharSequence text, OnClickListener listener) {
    return this;
}

@Override
public Builder setView(View view) {
    return this;
}

@Override
public Builder setTitle(int titleId) {
    this.setTitle(mContext.getResources().getString(titleId));
    return this;
}

@Override
public Builder setTitle(CharSequence s) {
    mTvTitle = mContainerView.findViewById(R.id.tv_title);
    mTvTitle.setVisibility(View.VISIBLE);
    mTvTitle.setText(s);
    return this;
}

@Override
public Builder setMessage(int messageId) {
    this.setMessage(mContext.getResources().getString(messageId));
    return this;
}

@Override
public Builder setMessage(@Nullable CharSequence message) {
    mTvMessage = mContainerView.findViewById(R.id.tv_message);
    mTvMessage.setVisibility(TextUtils.isEmpty(message) ? View.GONE : View.VISIBLE);
    mTvMessage.setText(message);
    return this;
}

@Override
public AlertDialog create() {
    mDialog = super.create();
    return mDialog;
}

@Override
public AlertDialog show() {
    initContentView();
    mDialog.show();
    return mDialog;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章