Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)

一、设置 Window 属性

1、Dialog
  • custom_dialog.xml
xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical"
    android:paddingStart="20dp"
    android:paddingTop="40dp"
    android:paddingEnd="20dp"
    android:paddingBottom="40dp">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="title"
        android:textSize="25dp" />

    <TextView
        android:id="@+id/tv_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:text="message"
        android:textSize="20dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp">

        <android.widget.Button
            android:id="@+id/btn_confirm"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="confirm"
            android:textColor="@color/black" />

        <android.widget.Button
            android:id="@+id/btn_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_weight="1"
            android:text="cancel"
            android:textColor="@color/black" />
    </LinearLayout>
</LinearLayout>
2、Test
java 复制代码
Dialog dialog = new Dialog(this);

dialog.setContentView(R.layout.custom_dialog);

TextView tvTitle = dialog.findViewById(R.id.tv_title);
TextView tvMessage = dialog.findViewById(R.id.tv_message);
Button btnConfirm = dialog.findViewById(R.id.btn_confirm);
Button btnCancel = dialog.findViewById(R.id.btn_cancel);
tvTitle.setText("系统提示");
tvMessage.setText("确定退出吗?");
btnConfirm.setOnClickListener(v -> {
    Toast.makeText(this, "点击了确定", Toast.LENGTH_SHORT).show();
    dialog.dismiss();
});
btnCancel.setOnClickListener(v -> {
    Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
    dialog.dismiss();
});

Window window = dialog.getWindow();
if (window != null) {
    window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

dialog.show();
  • 另一种设置 Window 属性的方式
java 复制代码
Dialog dialog = new Dialog(this);

dialog.setContentView(R.layout.custom_dialog);

TextView tvTitle = dialog.findViewById(R.id.tv_title);
TextView tvMessage = dialog.findViewById(R.id.tv_message);
Button btnConfirm = dialog.findViewById(R.id.btn_confirm);
Button btnCancel = dialog.findViewById(R.id.btn_cancel);
tvTitle.setText("系统提示");
tvMessage.setText("确定退出吗?");
btnConfirm.setOnClickListener(v -> {
    Toast.makeText(this, "点击了确定", Toast.LENGTH_SHORT).show();
    dialog.dismiss();
});
btnCancel.setOnClickListener(v -> {
    Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
    dialog.dismiss();
});

Window window = dialog.getWindow();
if (window != null) {
    WindowManager.LayoutParams params = window.getAttributes();
    params.width = WindowManager.LayoutParams.MATCH_PARENT;
    params.height = WindowManager.LayoutParams.MATCH_PARENT;
    window.setAttributes(params);
}

dialog.show();
xml 复制代码
<style name="FullScreenDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>
</style>

二、使用自定义样式

1、Style
  • res/values/styles.xml
xml 复制代码
<style name="FullScreenDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>
</style>
  1. windowFullscreen 设置为 true 强制 Dialog 进入全屏模式

  2. windowIsFloating 设置为 false 告诉系统这个 Dialog 不悬浮,可以占据整个屏幕

2、Dialog
  • custom_dialog.xml
xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical"
    android:paddingStart="20dp"
    android:paddingTop="40dp"
    android:paddingEnd="20dp"
    android:paddingBottom="40dp">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="title"
        android:textSize="25dp" />

    <TextView
        android:id="@+id/tv_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:text="message"
        android:textSize="20dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp">

        <android.widget.Button
            android:id="@+id/btn_confirm"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="confirm"
            android:textColor="@color/black" />

        <android.widget.Button
            android:id="@+id/btn_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_weight="1"
            android:text="cancel"
            android:textColor="@color/black" />
    </LinearLayout>
</LinearLayout>
3、Test
java 复制代码
Dialog dialog = new Dialog(this, R.style.FullScreenDialog);

dialog.setContentView(R.layout.custom_dialog);

TextView tvTitle = dialog.findViewById(R.id.tv_title);
TextView tvMessage = dialog.findViewById(R.id.tv_message);
Button btnConfirm = dialog.findViewById(R.id.btn_confirm);
Button btnCancel = dialog.findViewById(R.id.btn_cancel);
tvTitle.setText("系统提示");
tvMessage.setText("确定退出吗?");
btnConfirm.setOnClickListener(v -> {
    Toast.makeText(this, "点击了确定", Toast.LENGTH_SHORT).show();
    dialog.dismiss();
});
btnCancel.setOnClickListener(v -> {
    Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
    dialog.dismiss();
});

dialog.show();

三、继承 DialogFragment 实现

1、Dialog
  • custom_dialog.xml
xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical"
    android:paddingStart="20dp"
    android:paddingTop="40dp"
    android:paddingEnd="20dp"
    android:paddingBottom="40dp">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="title"
        android:textSize="25dp" />

    <TextView
        android:id="@+id/tv_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:text="message"
        android:textSize="20dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp">

        <android.widget.Button
            android:id="@+id/btn_confirm"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="confirm"
            android:textColor="@color/black" />

        <android.widget.Button
            android:id="@+id/btn_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_weight="1"
            android:text="cancel"
            android:textColor="@color/black" />
    </LinearLayout>
</LinearLayout>
  • FullScreenDialogFragment.java
java 复制代码
public class FullScreenDialogFragment extends DialogFragment {

    private FragmentActivity fragmentActivity;

    private TextView tvTitle;
    private TextView tvMessage;
    private Button btnConfirm;
    private Button btnCancel;

    private String titleStr;
    private String messageStr;
    private String confirmStr;
    private String cancelStr;

    private OnConfirmClickObserver onConfirmClickObserver;
    private OnCancelClickObserver onCancelClickObserver;

    public FullScreenDialogFragment(FragmentActivity fragmentActivity,
                                    String titleStr,
                                    String messageStr,
                                    String confirmStr,
                                    String cancelStr,
                                    OnConfirmClickObserver onConfirmClickObserver,
                                    OnCancelClickObserver onCancelClickObserver) {
        this.fragmentActivity = fragmentActivity;
        this.titleStr = titleStr;
        this.messageStr = messageStr;
        this.confirmStr = confirmStr;
        this.cancelStr = cancelStr;
        this.onConfirmClickObserver = onConfirmClickObserver;
        this.onCancelClickObserver = onCancelClickObserver;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.custom_dialog, container, false);

        tvTitle = view.findViewById(R.id.tv_title);
        tvMessage = view.findViewById(R.id.tv_message);
        btnConfirm = view.findViewById(R.id.btn_confirm);
        btnCancel = view.findViewById(R.id.btn_cancel);

        tvTitle.setText(titleStr);
        tvMessage.setText(messageStr);
        btnConfirm.setText(confirmStr);
        btnCancel.setText(cancelStr);

        btnConfirm.setOnClickListener(v -> {
            if (onConfirmClickObserver != null) onConfirmClickObserver.confirm();
            dismiss();
        });

        btnCancel.setOnClickListener(v -> {
            if (onCancelClickObserver != null) onCancelClickObserver.cancel();
            dismiss();
        });

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();

        Dialog dialog = getDialog();
        if (dialog == null) return;
        Window window = dialog.getWindow();
        if (window == null) return;
        window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    }

    public void show() {
        super.show(fragmentActivity.getSupportFragmentManager(), "");
    }
}
2、Test
java 复制代码
FullScreenDialogFragment dialogFragment = new FullScreenDialogFragment(
        this,
        "系统提示",
        "确定退出吗?",
        "确定",
        "取消",
        () -> {
            Toast.makeText(this, "点击了确定", Toast.LENGTH_SHORT).show();
        },
        () -> {
            Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
        });

dialogFragment.show();

四、继承 Dialog 实现

1、Dialog
  • custom_dialog.xml
xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical"
    android:paddingStart="20dp"
    android:paddingTop="40dp"
    android:paddingEnd="20dp"
    android:paddingBottom="40dp">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="title"
        android:textSize="25dp" />

    <TextView
        android:id="@+id/tv_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:text="message"
        android:textSize="20dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp">

        <android.widget.Button
            android:id="@+id/btn_confirm"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="confirm"
            android:textColor="@color/black" />

        <android.widget.Button
            android:id="@+id/btn_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_weight="1"
            android:text="cancel"
            android:textColor="@color/black" />
    </LinearLayout>
</LinearLayout>
  • FullScreenDialog.java
java 复制代码
public class FullScreenDialog extends Dialog {

    private TextView tvTitle;
    private TextView tvMessage;
    private Button btnConfirm;
    private Button btnCancel;

    private String titleStr;
    private String messageStr;
    private String confirmStr;
    private String cancelStr;

    private OnConfirmClickObserver onConfirmClickObserver;
    private OnCancelClickObserver onCancelClickObserver;

    public FullScreenDialog(@NonNull Context context) {
        super(context);
    }

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

        setContentView(R.layout.custom_dialog);

        tvTitle = findViewById(R.id.tv_title);
        tvMessage = findViewById(R.id.tv_message);
        btnConfirm = findViewById(R.id.btn_confirm);
        btnCancel = findViewById(R.id.btn_cancel);

        tvTitle.setText(titleStr);
        tvMessage.setText(messageStr);
        btnConfirm.setText(confirmStr);
        btnCancel.setText(cancelStr);

        btnConfirm.setOnClickListener(view -> {
            if (onConfirmClickObserver != null) onConfirmClickObserver.confirm();
            dismiss();
        });

        btnCancel.setOnClickListener(view -> {
            if (onCancelClickObserver != null) onCancelClickObserver.cancel();
            dismiss();
        });

        Window window = getWindow();
        if (window == null) return;
        window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    }

    public void setTitle(String str) {
        this.titleStr = str == null ? "" : str;
    }

    public void setMessage(String str) {
        this.messageStr = str == null ? "" : str;
    }

    public void setConfirm(String str, OnConfirmClickObserver onConfirmClickObserver) {
        this.confirmStr = str == null ? "" : str;
        this.onConfirmClickObserver = onConfirmClickObserver;
    }

    public void setCancel(String str, OnCancelClickObserver onCancelClickObserver) {
        this.cancelStr = str == null ? "" : str;
        this.onCancelClickObserver = onCancelClickObserver;
    }
}
2、Test
java 复制代码
FullScreenDialog fullScreenDialog = new FullScreenDialog(this);

fullScreenDialog.setTitle("系统提示");
fullScreenDialog.setMessage("确定退出吗?");
fullScreenDialog.setConfirm("确定", () -> {
    Toast.makeText(this, "点击了确定", Toast.LENGTH_SHORT).show();
});
fullScreenDialog.setCancel("取消", () -> {
    Toast.makeText(this, "点击了取消", Toast.LENGTH_SHORT).show();
});

fullScreenDialog.show();
相关推荐
爱吃甜品的糯米团子22 分钟前
详解 JavaScript 内置对象与包装类型:方法、案例与实战
java·开发语言·javascript
程序定小飞1 小时前
基于springboot的学院班级回忆录的设计与实现
java·vue.js·spring boot·后端·spring
攀小黑1 小时前
基于若依-内容管理动态修改,通过路由字典配置动态管理
java·vue.js·spring boot·前端框架·ruoyi
青云交2 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市空气质量监测与污染溯源中的应用
java·spark·lstm·可视化·java 大数据·空气质量监测·污染溯源
森语林溪2 小时前
大数据环境搭建从零开始(十七):JDK 17 安装与配置完整指南
java·大数据·开发语言·centos·vmware·软件需求·虚拟机
郝开3 小时前
Spring Boot 2.7.18(最终 2.x 系列版本)1 - 技术选型:连接池技术选型对比;接口文档技术选型对比
java·spring boot·spring
stevenzqzq3 小时前
Android Hilt 入门教程_传统写法和Hilt写法的比较
android
wuwu_q3 小时前
用通俗易懂方式,详细讲讲 Kotlin Flow 中的 map 操作符
android·开发语言·kotlin
小猪咪piggy3 小时前
【项目】小型支付商城 MVC/DDD
java·jvm·数据库
知兀3 小时前
【Spring/SpringBoot】SSM(Spring+Spring MVC+Mybatis)方案、各部分职责、与Springboot关系
java·spring boot·spring