Android 自定义Dialog

话不多说,直接上代码哈~

1、Dialog工具类
/**
 * @Author Catherine
 * @Description Custom common dialog.
 * @Date 2021/5/27
 **/
public class CustomCommonDialog extends Dialog {

    /**
     * 显示的标题
     */
    private TextView dialog_tv_title;

    /**
     * 显示的图片
     */
    private ImageView dialog_iv_image;

    /**
     * 显示的内容
     */
    private TextView dialog_tv_content;

    /**
     * 确认和取消按钮
     */
    private Button dialog_btn_negative, dialog_btn_positive;

    /**
     * 按钮之间的分割线
     */
    private View dialog_view_column_line;

    public CustomCommonDialog(Context context) {
        super(context, R.style.CustomDialog);
    }

    /**
     * 都是内容数据
     */
    private String title;
    private String content;
    private String btnPositiveStr, btnNegativeStr;
    private int imageResId = -1;

    /**
     * 底部是否只有一个按钮
     */
    private boolean isSingle = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.layout_custom_common_dialog);
        //按空白处不能取消动画
        setCanceledOnTouchOutside(false);
        //初始化界面控件
        initView();
        //初始化界面数据
        refreshView();
        //初始化界面控件的事件
        initEvent();
    }

    /**
     * 初始化界面的确定和取消监听器
     */
    private void initEvent() {

        //设置确定按钮被点击后,向外界提供监听
        dialog_btn_positive.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onClickBottomListener != null) {
                    onClickBottomListener.onPositiveClick();
                }
            }
        });

        //设置取消按钮被点击后,向外界提供监听
        dialog_btn_negative.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
                if (onClickBottomListener != null) {
                    onClickBottomListener.onNegativeClick();
                }
            }
        });
    }

    /**
     * 初始化界面控件的显示数据
     */
    private void refreshView() {
        //如果用户自定了title和message
        if (!TextUtils.isEmpty(title)) {
            dialog_tv_title.setText(title);
            dialog_tv_title.setVisibility(View.VISIBLE);
        } else {
            dialog_tv_title.setVisibility(View.GONE);
        }
        if (!TextUtils.isEmpty(content)) {
            dialog_tv_content.setText(content);
        }

        //如果设置按钮的文字
        if (!TextUtils.isEmpty(btnPositiveStr)) {
            dialog_btn_positive.setText(btnPositiveStr);
        } else {
            dialog_btn_positive.setText("确定");
        }
        if (!TextUtils.isEmpty(btnNegativeStr)) {
            dialog_btn_negative.setText(btnNegativeStr);
        } else {
            dialog_btn_negative.setText("取消");
        }

        if (imageResId != -1) {
            dialog_iv_image.setImageResource(imageResId);
            dialog_iv_image.setVisibility(View.VISIBLE);
        } else {
            dialog_iv_image.setVisibility(View.GONE);
        }

        /**
         * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件
         */
        if (isSingle) {
            dialog_view_column_line.setVisibility(View.GONE);
            dialog_btn_negative.setVisibility(View.GONE);
        } else {
            dialog_btn_negative.setVisibility(View.VISIBLE);
            dialog_view_column_line.setVisibility(View.VISIBLE);
        }
    }

    @Override

    public void show() {
        super.show();
        refreshView();
    }

    /**
     * 初始化界面控件
     */
    private void initView() {
        dialog_btn_negative = (Button) findViewById(R.id.dialog_btn_negative);
        dialog_btn_positive = (Button) findViewById(R.id.dialog_btn_positive);
        dialog_tv_title = (TextView) findViewById(R.id.dialog_tv_title);
        dialog_tv_content = (TextView) findViewById(R.id.dialog_tv_content);
        dialog_iv_image = (ImageView) findViewById(R.id.dialog_iv_image);
        dialog_view_column_line = findViewById(R.id.dialog_view_column_line);
    }

    /**
     * 设置确定取消按钮的回调
     */
    public OnClickBottomListener onClickBottomListener;

    public CustomCommonDialog setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
        this.onClickBottomListener = onClickBottomListener;
        return this;
    }

    public interface OnClickBottomListener {

        /**
         * 点击确定按钮事件
         */
        void onPositiveClick();

        /**
         * 点击取消按钮事件
         */
        void onNegativeClick();
    }

    public String getContent() {
        return content;
    }

    public CustomCommonDialog setContent(String content) {
        this.content = content;
        return this;
    }

    public String getTitle() {
        return title;
    }

    public CustomCommonDialog setTitle(String title) {
        this.title = title;
        return this;
    }

    public String getBtnPositiveStr() {
        return btnPositiveStr;
    }

    public CustomCommonDialog setBtnPositiveStr(String btnPositiveStr) {
        this.btnPositiveStr = btnPositiveStr;
        return this;
    }

    public String getBtnNegativeStr() {
        return btnNegativeStr;
    }

    public CustomCommonDialog setBtnNegativeStr(String btnNegativeStr) {
        this.btnNegativeStr = btnNegativeStr;
        return this;
    }

    public int getImageResId() {
        return imageResId;
    }

    public boolean isSingle() {
        return isSingle;
    }

    public CustomCommonDialog setSingle(boolean single) {
        isSingle = single;
        return this;
    }

    public CustomCommonDialog setImageResId(int imageResId) {
        this.imageResId = imageResId;
        return this;
    }
}

2、layout_custom_common_dialog.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:background="@drawable/shape_rectangle_white"
    android:orientation="vertical"
    android:paddingTop="16dp">

    <TextView
        android:id="@+id/dialog_tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="10dp"
        android:gravity="center"
        android:textColor="#333333"
        android:textSize="18sp"
        android:visibility="visible"
        tools:text="提示" />

    <ImageView
        android:id="@+id/dialog_iv_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="10dp"
        android:maxWidth="150dp"
        android:maxHeight="150dp"
        android:visibility="visible"
        tools:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/dialog_tv_content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:gravity="center|left"
        android:lineSpacingExtra="3dp"
        android:textColor="#666666"
        android:textSize="15sp"
        tools:text="提示内容" />

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:layout_marginTop="16dp"
        android:background="#999999" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/dialog_btn_negative"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@null"
            android:gravity="center"
            android:paddingTop="16dp"
            android:paddingBottom="16dp"
            android:singleLine="true"
            android:textColor="#999999"
            android:textSize="16sp"
            tools:text="No" />

        <View
            android:id="@+id/dialog_view_column_line"
            android:layout_width="0.5dp"
            android:layout_height="match_parent"
            android:background="#999999" />

        <Button
            android:id="@+id/dialog_btn_positive"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@null"
            android:gravity="center"
            android:paddingTop="16dp"
            android:paddingBottom="16dp"
            android:singleLine="true"
            android:textColor="#38ADFF"
            android:textSize="16sp"
            tools:text="Yes" />

    </LinearLayout>
</LinearLayout>
3、CustomDialog —— style.xml
    <style name="CustomDialog" parent="DialogTheme">
        <!--背景颜色和透明度-->
        <item name="android:windowBackground">@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、@drawable/shape_rectangle_white
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:width="32dp" android:height="32dp">
        <shape android:shape="rectangle">
            <solid android:color="#fff" />
            <corners android:radius="12dp" />
        </shape>
    </item>
</selector>
5、在Activity里使用
    //初始化并弹出对话框方法
    private void showDialog() {
        CustomCommonDialog dialog = new CustomCommonDialog(this).setTitle("提示")
                .setContent("悬浮窗权限将用于保持教师和学生间的通话。若不同意,将会影响部分功能的正常使用。\n请问是否同意我们向您获取该权限?")
        .setBtnPositiveStr("同意并前往开启").setBtnNegativeStr("下次再说");
        dialog.create();
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);
        dialog.setOnClickBottomListener(new CustomCommonDialog.OnClickBottomListener() {
            @Override
            public void onPositiveClick() {
                if (checkIsHuaweiRom()) {
                    HuaweiFloatingPermissionUtils.applyPermission(MainActivity.this);
                } else if (checkIsMiuiRom()) {
                    MiuiFloatingPermissionUtils.applyMiuiPermission(MainActivity.this);
                } else if (checkIs360Rom()) {
                    QikuFloatingPermissionUtils.applyPermission(MainActivity.this);
                } else if (checkIsMeizuRom()) {
                    MeizuFloatingPermissionUtils.applyPermission(MainActivity.this);
                } else if (checkIsOppoRom()) {
                    OppoFloatingPermissionUtils.applyPermission(MainActivity.this);
                } else {
                    requestAlertWindowPermission();
                }
                dialog.dismiss();
            }

            @Override
            public void onNegativeClick() {

            }
        });
     dialog.show();
     //此处设置位置窗体大小,设置为手机屏幕宽度的5/6,注意一定要在show方法调用后再写设置窗口大小的代码,否则不起效果
     dialog.getWindow().setLayout((ScreenUtils.getScreenWidth(this) / 6 * 5), LinearLayout.LayoutParams.WRAP_CONTENT);
    }

感谢:https://www.jianshu.com/p/02cbde66a93e

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容