Android——自定义Dialog样式(含背景透明设置和对话框位置设置)

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>

推荐阅读:
Android——Dialog使用详解

发布了11 篇原创文章 · 获赞 3 · 访问量 3651

猜你喜欢

转载自blog.csdn.net/qq_43567345/article/details/104236499