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();
相关推荐
沐浴露z3 小时前
为什么使用SpringAI时通常用Builder来创建对象?详解 【Builder模式】和【直接 new】的区别
java·python·建造者模式
阿杰真不会敲代码3 小时前
Filter与Interceptor深度解析:分清这两个“拦截器”,面试不再掉坑
java·spring boot·面试
g***78914 小时前
鸿蒙NEXT(五):鸿蒙版React Native架构浅析
android·前端·后端
带刺的坐椅4 小时前
Solon AI 开发学习6 - chat - 两种 http 流式输入输出
java·ai·solon
客梦4 小时前
Java 道路信息系统
java·笔记
k***1955 小时前
Tomcat的升级
java·tomcat
j***49566 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
草莓熊Lotso6 小时前
unordered_map/unordered_set 使用指南:差异、性能与场景选择
java·开发语言·c++·人工智能·经验分享·python·网络协议
20岁30年经验的码农8 小时前
Spring Cloud Gateway 网关技术文档
java