private final OnConfirmClickListener onConfirmClickListener;//确认的点击事件
public interface OnConfirmClickListener{
void onClick(View view);
}
public interface OnCancleClickListener{
void onClick(View view);
}
//构造方法,其实这儿可以直接传一个builder过来的,就像OKHttp的构造方法一样
private CommonAlertDialog(@NonNull Context context, String TITLE, String MESSAGE, String CONFIRMTEXT, String CANCLETEXT,
OnCancleClickListener onCancleClickListener, OnConfirmClickListener onConfirmClickListener) {
super(context,R.style.AlertDialogUtil);
this.TITLE = TITLE;
this.MESSAGE = MESSAGE;
this.CONFIRMTEXT = CONFIRMTEXT;
this.CANCLETEXT = CANCLETEXT;
this.onCancleClickListener = onCancleClickListener;
this.onConfirmClickListener = onConfirmClickListener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_common_dialog);
initView();
}
public static Builder Builder(Context context){
return new Builder(context);
}
private void initView() {
Button btnConfirm = findViewById(R.id.btn_confirm);
Button btnCancel = findViewById(R.id.btn_cancel);
TextView tvTitle = findViewById(R.id.tv_title);
TextView tvMessage = findViewById(R.id.tv_message);
if (!TextUtils.isEmpty(TITLE)) {
tvTitle.setText(TITLE);
}
if (!TextUtils.isEmpty(MESSAGE)) {
tvMessage.setText(MESSAGE);
}
if (!TextUtils.isEmpty(CONFIRMTEXT)) {
btnConfirm.setText(CONFIRMTEXT);
}
if (!TextUtils.isEmpty(CANCLETEXT)) {
btnCancel.setText(CANCLETEXT);
}
btnConfirm.setOnClickListener(v -> {
if(null != onConfirmClickListener){
onConfirmClickListener.onClick(v);
}
dismiss();
});
btnCancel.setOnClickListener(v -> {
if(null != onCancleClickListener){
onCancleClickListener.onClick(v);
}
dismiss();
});
}
public CommonAlertDialog shown(){
show();
return this;
}
//创建Builder类
public static class Builder{
private String mTitle;
private String mMessage;
private String mConfirmText;
private String mCancelText;
private OnConfirmClickListener mOnConfirmClickListener;
private OnCancleClickListener mOnCancleClickListener;
private Context mContext;
private Builder(Context mContext) {
this.mContext = mContext;
}
public Builder setTitle(String title){
this.mTitle = title;
return this;
}
public Builder setMessage(String message){
this.mMessage = message;
return this;
}
public Builder setConfirmText(String mConfirmText) {
this.mConfirmText = mConfirmText;
return this;
}
public Builder setCancelText(String mCancelText) {
this.mCancelText = mCancelText;
return this;
}
public Builder setOnConfirmClickListener(OnConfirmClickListener mOnConfirmClickListener) {
this.mOnConfirmClickListener = mOnConfirmClickListener;
return this;
}
public Builder setOnCancleClickListener(OnCancleClickListener mOnCancelClickListener) {
this.mOnCancleClickListener = mOnCancelClickListener;
return this;
}
//build时返回dialog对象,就是从这儿创建的对象
public CommonAlertDialog build(){
return new CommonAlertDialog(mContext,mTitle,mMessage,mConfirmText,mCancelText,
mOnCancleClickListener,mOnConfirmClickListener);
}
}
}
#### 《设计思想解读开源框架》
![](https://img-blog.csdnimg.cn/img_convert/a83c344c4686991374daa3788e5abe31.webp?x-oss-process=image/format,png)
**第一章、 热修复设计**
* **第一节、 AOT/JIT & dexopt 与 dex2oat**
* **第二节、 热修复设计之 CLASS_ISPREVERIFIED 问题**
* **第三节、热修复设计之热修复原理**
* **第四节、Tinker 的集成与使用(自动补丁包生成)**
![](https://img-blog.csdnimg.cn/img_convert/9974eedc2074b44978242ae3ca108d2d.webp?x-oss-process=image/format,png)
**第二章、 插件化框架设计**
* **第一节、 Class 文件与 Dex 文件的结构解读**
* **第二节、 Android 资源加载机制详解**
* **第三节、 四大组件调用原理**
* **第四节、 so 文件加载机制**
* **第五节、 Android 系统服务实现原理**
![](https://img-blog.csdnimg.cn/img_convert/8e547204f008702b0ea76f41520adc64.webp?x-oss-process=image/format,png)
**第三章、 组件化框架设计**
* **第一节、阿里巴巴开源路由框——ARouter 原理分析**
* **第二节、APT 编译时期自动生成代码&动态类加载**
* **第三节、 Java SPI 机制**
* **第四节、 AOP&IOC**
* **第五节、 手写组件化架构**
![](https://img-blog.csdnimg.cn/img_convert/c14ac055103dcf81adfdec8e2eee50e9.webp?x-oss-process=image/format,png)
**第四章、图片加载框架**
* **第一节、图片加载框架选型**
* **第二节、Glide 原理分析**
* **第三节、手写图片加载框架实战**
![](https://img-blog.csdnimg.cn/img_convert/f811bf7efc67d9f8afff221b00dfc34b.webp?x-oss-process=image/format,png)
**第五章、网络访问框架设计**
* **第一节、网络通信必备基础**
* **第二节、OkHttp 源码解读**
* **第三节、Retrofit 源码解析**
![](https://img-blog.csdnimg.cn/img_convert/c3396a7d659f019c14d99713804e5774.webp?x-oss-process=image/format,png)
**第六章、 RXJava 响应式编程框架设计**
* **第一节、链式调用**
* **第二节、 扩展的观察者模式**
* **第三节、事件变换设计**
* **第四节、Scheduler 线程控制**
![](https://img-blog.csdnimg.cn/img_convert/297894c408d4165dc6b43d1156663f8b.webp?x-oss-process=image/format,png)
**第七章、 IOC 架构设计**
* **第一节、 依赖注入与控制反转**
* **第二节、ButterKnife 原理上篇、中篇、下篇**
* **第三节、Dagger 架构设计核心解密**
![](https://img-blog.csdnimg.cn/img_convert/64408d0f0192a40b481320dfb5dc0409.webp?x-oss-process=image/format,png)
**第八章、 Android 架构组件 Jetpack**
* **第一节、 LiveData 原理**
* **第二节、 Navigation 如何解决 tabLayout 问题**
* **第三节、 ViewModel 如何感知 View 生命周期及内核原理**
* **第四节、 Room 架构方式方法**
* **第五节、 dataBinding 为什么能够支持 MVVM**
* **第六节、 WorkManager 内核揭秘**
* **第七节、 Lifecycles 生命周期**
![](https://img-blog.csdnimg.cn/img_convert/8d9f76a4839b9569c284838899a001a5.webp?x-oss-process=image/format,png)
**本文包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…**
![](https://img-blog.csdnimg.cn/img_convert/2fd7026a4b254ed620b5c2c7edce72d7.webp?x-oss-process=image/format,png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
56523)]
**本文包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…**
[外链图片转存中...(img-0mzMNX99-1714457256523)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**