Android本身为开发者提供了很多Dialog样式,基本上已经包含了普通列表、单选、多选、等待、进度条、编辑等多种对话框形式,不过对于一个开发者而言还是远远不够的。下面将简单介绍一下自定义Dialog如何实现并使用。
我们将开发一个如图所示的样例。
1、创建一个Dialog的子类CustomDialog,实现构造方法。
CustomDialog.java详细代码如下:
package com.example.myapplication;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
public class CustomDialog extends AlertDialog {
private OnClickListener listener;
private TextView tvCancel;
private TextView tvConfirm;
private TextView tvTitle;
private TextView tvContent;
private String title;
private String message;
public CustomDialog(Context context) {
super(context, R.style.CustomDialog);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_dialog_layout);
setCanceledOnTouchOutside(false);
//设置对话框的显示位置
setDialogStartPositon();
//绑定控件
initView();
//初始化个组件的内容
initText();
//设置点击事件触发
initEvent();
}
private void setDialogStartPositon() {
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
Window window = getWindow();
lp.copyFrom(window.getAttributes());
lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
//设置起始位置
// lp.x = 100;
// lp.y = 100;
lp.gravity = Gravity.CENTER;
window.setAttributes(lp);
}
private void initEvent() {
tvCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.onCancelClick();
dismiss();
}
});
tvConfirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.onConfirmClick();
dismiss();
}
});
}
private void initText() {
if (title != null) tvTitle.setText(title);
if (message != null) tvContent.setText(message);
tvCancel.setText("取消");
tvConfirm.setText("确认");
}
public CustomDialog setTitle(String title) {
this.title = title;
return this;
}
public CustomDialog setMessage(String message) {
this.message = message;
return this;
}
private void initView() {
tvCancel = findViewById(R.id.tv_cancel);
tvConfirm = findViewById(R.id.tv_confirm);
tvTitle = findViewById(R.id.tv_title);
tvContent = findViewById(R.id.tv_content);
}
//提供给外部使用的方法
public CustomDialog setOnClickListener(OnClickListener listener){
this.listener = listener;
return this;
}
public interface OnClickListener{
void onCancelClick();
void onConfirmClick();
}
}
2、创建一个自定义对话框布局文件custom_dialog_layout.xml,完成自定义对话框布局。
custom_dialog_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp"
android:layout_height="200dp"
android:padding="10dp"
android:background="@drawable/custom_dialog_bg">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Title"
android:textColor="#000000"
android:textSize="25sp">
</TextView>
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title"
android:layout_marginTop="15dp"
android:text="message"
android:textColor="#000000"
android:textSize="25sp">
</TextView>
<TextView
android:id="@+id/tv_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="40dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="20dp"
android:text="取 消"
android:textColor="#2196F3"
android:textSize="25sp">
</TextView>
<TextView
android:id="@+id/tv_confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="5dp"
android:layout_marginRight="40dp"
android:layout_marginBottom="20dp"
android:text="确 认"
android:textColor="#2196F3"
android:textSize="25sp">
</TextView>
</RelativeLayout>
3、在资源文件styles.xml添加自定义对话框风格。
代码如下:
<style name="CustomDialog" parent="android:style/Theme.Dialog">
<!--背景颜色及和透明程度-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--是否去除标题 -->
<item name="android:windowNoTitle">true</item>
<!--是否去除边框-->
<item name="android:windowFrame">@null</item>
<!--是否浮现在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--是否模糊-->
<item name="android:backgroundDimEnabled">true</item>
</style>
4、为了让对话框尽可能好看,我们还添加了背景样式custom_dialog_bg.xml.
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#C9C7C7" />
<stroke
android:width="0.8dp"
android:color="#ffffff" />
<!-- 圆角-->
<corners android:radius="10dp" />
</shape>
5、最后在MainActivity里实现对话框的调用。这里通过在布局文件添加一个按钮,使按钮被点击弹出对话框
详细代码如下:
MainActivity.java
package com.example.myapplication;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private CustomDialog customDialog;
private Button mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn = findViewById(R.id.self_dialog);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
customDialog = new CustomDialog(MainActivity.this);
customDialog.setTitle("提示")//设置标题
.setMessage("确定退出应用?")//设置提示内容
.setOnClickListener(new CustomDialog.OnClickListener() {//设置点击事件
@Override
public void onCancelClick() {
Toast.makeText(MainActivity.this,"你点击了取消键!",Toast.LENGTH_SHORT)
.show();
}
@Override
public void onConfirmClick() {
Toast.makeText(MainActivity.this,"你点击了确认键!",Toast.LENGTH_SHORT)
.show();
}
})
.show();//显示对话框
}
});
}
}
activity_main.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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="@color/colorAccent">
<Button
android:id="@+id/self_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
链接:百度网盘下载 提取码:d3fr
推荐阅读:
Android——Dialog使用详解