安卓自定义dialog的实现

首先很感谢简书上的一位博主,在我焦头烂额地在网上找自定义dialog时,遇见了他写的一篇文章,看完之后很快就学会了自定义dialog的使用。

这里我附上他的文章地址,大家可以转过去看一下

android:自定义Dialog(通用) - 简书 (jianshu.com)

话不多说,上图,上代码!
效果图如下:
自定义dialog的效果图

具体实现代码如下:

(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="您提出的建议和鼓励,能让&#x000A;我们变得更好。" />

    <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的显示
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值