? ? ? ? 在之前的文章中介绍了自定Dialog的实现方法之一:https://blog.csdn.net/m0_57487205/article/details/124775019?spm=1001.2014.3001.5501https://blog.csdn.net/m0_57487205/article/details/124775019?spm=1001.2014.3001.5501? ? ? 这篇文章记录一下另外一种实现自定义Dialog的方法:
首先创建一个自己的MyDialog类集成Dialog,集成Dialog 之后会爆红,只需要按Alt+insert键快捷插入构造方法即可,然后需要重写onCreate()方法,在onCreate()方法中通过setContentView(R.layout.dialog_layout)方法指定弹窗需要显示的layout布局,布局可以随便自定义:
1、MyDialog代码:
public class MyDialog extends Dialog {
public MyDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_layout);
}
}
2:dialog_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="300dp"
android:layout_height="200dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:background="@drawable/dialog_shape"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="温馨提示"
android:textColor="#8276F1"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="是否确定删除此文件?"
android:textSize="15sp"
android:textColor="#ff0000"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/textView" />
<Button
android:id="@+id/no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginBottom="16dp"
android:text="取消"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/yes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:text="确定"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
? ? ? ? ?编写好布局文件后就可以对一些逻辑进行整理了,类似于Activity,在onCreate()方法中就可以执行findViewById()操作了,接着就是弹窗按钮的点击时间监听,实现链式编程,一定程度上简化了弹窗的调用流程,下面是完整的MyDialog代码:
/**
* 自定义dialog
*/
public class MyDialog extends Dialog {
private Button button_no;
private Button button_yes;
private String title = "title";
private String message = "message";
private DialogClickListener listener;
/**
* 构造器
* @param context 上下文对象
* @param themeResId 弹窗样式
*/
public MyDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
/**
* 设置弹窗的标题
* @param title 标题内容
* @return 返回当前弹窗对象实现链式编程
*/
public MyDialog setTitle(String title) {
this.title = title;
return this;
}
/**
* 设置弹窗的提示内容
* @param message 内容
* @return **
*/
public MyDialog setMessage(String message) {
this.message = message;
return this;
}
/**
* 设置点击事件监听对象(传入调用者创建的监听对象)
* @param listener 监听对象
* @return **
*/
public MyDialog setClickListener(DialogClickListener listener) {
this.listener = listener;
return this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_layout);
button_no = findViewById(R.id.no);
button_yes = findViewById(R.id.yes);
TextView textView_title = findViewById(R.id.textView);
TextView textView_message = findViewById(R.id.message);
textView_title.setText(title);
textView_message.setText(message);
initListener();
}
private void initListener() {
button_no.setOnClickListener(view -> {
if (null != listener)
listener.onNO();//接口回调
dismiss();
});
button_yes.setOnClickListener(view -> {
if (null != listener)
listener.onYes();//接口回调
dismiss();
});
}
public interface DialogClickListener {
void onYes();
void onNO();
}
}
? ? 由于在使用弹窗的时候,调用者需要监听用户到底点了弹窗中的哪一些按钮,或者执行了什么操作,所以需要一个弹窗的接口类进行时间的监听(代码已详细说明,比较好).
最后就是弹窗的调用了:
private void showDialog() {
MyDialog myDialog = new MyDialog(this, R.style.dialog);
myDialog.setCancelable(false);//返回键不可以关闭弹窗
myDialog.setCanceledOnTouchOutside(false);//点击弹窗之外不能关闭弹窗
myDialog.setTitle("温馨提示")
.setMessage("确定要删除这个文件吗?")
.setClickListener(new MyDialog.DialogClickListener() {
@Override
public void onYes() {
Log.e("Dialog", "点击确定要做的事情在这里写");
}
@Override
public void onNO() {
Log.e("Dialog", "点击取消要做的事情在这里写");
}
}).show();
}
这是效果图)
?
|