首先很感谢简书上的一位博主,在我焦头烂额地在网上找自定义dialog时,遇见了他写的一篇文章,看完之后很快就学会了自定义dialog的使用。
这里我附上他的文章地址,大家可以转过去看一下
android:自定义Dialog(通用) - 简书 (jianshu.com)
话不多说,上图,上代码!
效果图如下:
具体实现代码如下:
(1)dialog_layout.xml(dialog的布局文件)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/dialog_background"
android:minWidth="282dp"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<ImageView
android:id="@+id/image"
tools:src="@mipmap/fivestars"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="7dp"
android:layout_marginTop="27dp"
android:layout_width="216dp"
android:layout_height="150dp" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="15dp"
tools:text="给个好评吧!"
android:textColor="#1A1A1A"
android:textSize="18sp" />
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:layout_gravity="center_horizontal"
android:textColor="#999999"
android:textSize="16sp"
tools:text="您提出的建议和鼓励,能让
我们变得更好。" />
<RelativeLayout
android:layout_marginTop="11dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="29dp"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_centerHorizontal="true">
<TextView
android:id="@+id/negative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/talk_later"
android:layout_marginRight="36dp"
android:gravity="center"
tools:text="以后再说"
android:textColor="#666666"
android:textSize="16sp" />
<TextView
android:layout_toRightOf="@id/negative"
android:id="@+id/positive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/fivestars_praise"
android:gravity="center"
tools:text="五星好评"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
(2)dialog_background.xml(dialog的背景)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<!-- 圆角 -->
<corners android:radius="8dp" />
</shape>
(3)fivestars_praise.xml(五星好评的背景)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#365BE0"/>
<corners android:radius="18dp"/>
<size android:width="110dp" android:height="36dp"/>
</shape>
(4)talk_later.xml(以后再说的背景)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white"/>
<corners android:radius="18dp"/>
<stroke android:color="#C6C6C6" android:width="0.5dp"/>
<size android:width="110dp" android:height="36dp"/>
</shape>
(5)styles.xml文件(dialog的样式)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<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>
</resources>
(6)Mydialog.java文件 (自定义dialog类继承Dialog)
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
/**
* description:自定义dialog
*/
public class MyDialog extends Dialog {
/**
* 显示的图片
*/
private ImageView imageIv ;
/**
* 显示的标题
*/
private TextView titleTv ;
/**
* 显示的消息
*/
private TextView messageTv ;
/**
* 确认和取消按钮
*/
private TextView negativeBn ,positiveBn;
/**
* 都是内容数据
*/
private String message;
private String title;
private String positive,negative ;
private int imageResId = -1 ;
/**
*构造器
*/
public MyDialog(Context context) {
super(context, R.style.CustomDialog);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_layout);
//按空白处不能取消动画
setCanceledOnTouchOutside(false);
//初始化界面控件
initView();
//初始化界面数据
refreshView();
//初始化界面控件的事件
initEvent();
}
/**
* 初始化界面的确定和取消监听器
*/
private void initEvent() {
//设置确定按钮被点击后,向外界提供监听
positiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if ( onClickBottomListener!= null) {
onClickBottomListener.onPositiveClick();
}
}
});
//设置取消按钮被点击后,向外界提供监听
negativeBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if ( onClickBottomListener!= null) {
onClickBottomListener.onNegativeClick();
}
}
});
}
/**
* 初始化界面控件的显示数据
*/
private void refreshView() {
//如果用户自定了title和message
if (!TextUtils.isEmpty(title)) {
titleTv.setText(title);
}else {
titleTv.setText("给个好评吧!");
}
if (!TextUtils.isEmpty(message)) {
messageTv.setText(message);
}else{
messageTv.setText("您提出的建议和鼓励,能让\n我们变得更好。");
}
//如果设置按钮的文字
if (!TextUtils.isEmpty(positive)) {
positiveBn.setText(positive);
}else {
positiveBn.setText("五星好评");
}
if (!TextUtils.isEmpty(negative)) {
negativeBn.setText(negative);
}else {
negativeBn.setText("以后再说");
}
if (imageResId!=-1){
imageIv.setImageResource(imageResId);
imageIv.setVisibility(View.VISIBLE);
}else {
imageIv.setVisibility(View.GONE);
}
}
@Override
public void show() {
super.show();
}
/**
* 初始化界面控件
*/
private void initView() {
negativeBn = (TextView) findViewById(R.id.negative);
positiveBn = (TextView) findViewById(R.id.positive);
titleTv = (TextView) findViewById(R.id.title);
messageTv = (TextView) findViewById(R.id.message);
imageIv = (ImageView) findViewById(R.id.image);
}
/**
* 设置确定取消按钮的回调
*/
public OnClickBottomListener onClickBottomListener;
public MyDialog setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
this.onClickBottomListener = onClickBottomListener;
return this;
}
public interface OnClickBottomListener{
/**
* 点击确定按钮事件
*/
public void onPositiveClick();
;
/**
* 点击取消按钮事件
*/
public void onNegativeClick();
}
public String getMessage() {
return message;
}
public MyDialog setMessage(String message) {
this.message = message;
return this ;
}
public String getTitle() {
return title;
}
public MyDialog setTitle(String title) {
this.title = title;
return this ;
}
public String getPositive() {
return positive;
}
public MyDialog setPositive(String positive) {
this.positive = positive;
return this ;
}
public String getNegative() {
return negative;
}
public MyDialog setNegative(String negative) {
this.negative = negative;
return this ;
}
public MyDialog setImageResId(int imageResId) {
this.imageResId = imageResId;
return this ;
}
}
(7)MainActivity.java文件
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.Toast;
import cn.pedant.SweetAlert.SweetAlertDialog;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDialog();
}
private void initDialog() {
MyDialog dialog = new MyDialog(MainActivity.this);
dialog.setImageResId(R.mipmap.fivestars) //这是我本地的图片资源,大家可以使用自己的图片资源代替
.setOnClickBottomListener(new MyDialog.OnClickBottomListener() {
@Override
public void onPositiveClick() {
}
@Override
public void onNegativeClick() {
dialog.dismiss();
}
}) //底下两个按钮的监听器
.show(); //dialog的显示
}
}