Android:Dialog的使用详解

Android中Dialog的使用详解

Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入。

1. 基本Dialog类型

1.1 AlertDialog(警告对话框)

最常用的对话框类型,可以设置标题、消息、按钮等:

new AlertDialog.Builder(this).setTitle("提示").setMessage("确定要删除此项吗?").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 确定按钮点击事件}}).setNegativeButton("取消", null).setNeutralButton("稍后提醒", null).show();

1.2 ProgressDialog(进度对话框,已废弃)

⚠️ 注意:ProgressDialog在API 26中已废弃,推荐使用ProgressBar

替代方案:

// 使用ProgressBar在布局中实现
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(R.layout.progress_dialog_layout);
AlertDialog dialog = builder.create();
dialog.show();

1.3 DatePickerDialog/TimePickerDialog(日期/时间选择对话框)

// 日期选择对话框
DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {// 处理选择的日期}}, 2023, 0, 1); // 初始年、月、日
datePickerDialog.show();// 时间选择对话框
TimePickerDialog timePickerDialog = new TimePickerDialog(this,new TimePickerDialog.OnTimeSetListener() {@Overridepublic void onTimeSet(TimePicker view, int hourOfDay, int minute) {// 处理选择的时间}}, 12, 0, true); // 初始小时、分钟,是否24小时制
timePickerDialog.show();

2. 自定义Dialog

2.1 使用自定义布局

AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = getLayoutInflater();
View dialogView = inflater.inflate(R.layout.custom_dialog_layout, null);
builder.setView(dialogView);// 获取自定义布局中的控件
EditText editText = dialogView.findViewById(R.id.dialog_edittext);
Button button = dialogView.findViewById(R.id.dialog_button);AlertDialog dialog = builder.create();
dialog.show();button.setOnClickListener(v -> {String input = editText.getText().toString();// 处理输入dialog.dismiss();
});

2.2 继承Dialog类创建完全自定义对话框

public class CustomDialog extends Dialog {public CustomDialog(@NonNull Context context) {super(context);setContentView(R.layout.custom_dialog_layout);Button closeButton = findViewById(R.id.close_button);closeButton.setOnClickListener(v -> dismiss());// 设置对话框窗口属性Window window = getWindow();if (window != null) {window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));WindowManager.LayoutParams params = window.getAttributes();params.width = WindowManager.LayoutParams.MATCH_PARENT;params.height = WindowManager.LayoutParams.WRAP_CONTENT;window.setAttributes(params);}}
}// 使用
CustomDialog customDialog = new CustomDialog(MainActivity.this);
customDialog.show();

3. DialogFragment(推荐方式)

DialogFragment是管理对话框生命周期的更好方式,特别是在Activity重建时:

public class MyDialogFragment extends DialogFragment {// 对话框逻辑将在这里实现
}

方式一:使用自定义布局(重写onCreateView)

Copy
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// 膨胀自定义布局View view = inflater.inflate(R.layout.fragment_dialog, container, false);// 初始化视图组件Button button = view.findViewById(R.id.button);button.setOnClickListener(v -> {// 处理点击事件dismiss(); // 关闭对话框});return view;
}

在Activity中显示对话框:

MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(), "MyDialogFragment");

使用AlertDialog(重写onCreateDialog)

使用AlertDialog(重写onCreateDialog)
public class MyDialogFragment extends DialogFragment {@NonNull@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());builder.setTitle("DialogFragment示例").setMessage("这是一个使用DialogFragment创建的对话框").setPositiveButton("确定", (dialog, id) -> {// 确定按钮点击事件}).setNegativeButton("取消", (dialog, id) -> {// 取消按钮点击事件});return builder.create();}
}// 显示DialogFragment
MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(), "my_dialog_tag");

带参数的DialogFragment

public class CustomDialogFragment extends DialogFragment {private static final String ARG_TITLE = "title";private static final String ARG_MESSAGE = "message";public static CustomDialogFragment newInstance(String title, String message) {CustomDialogFragment fragment = new CustomDialogFragment();Bundle args = new Bundle();args.putString(ARG_TITLE, title);args.putString(ARG_MESSAGE, message);fragment.setArguments(args);return fragment;}@NonNull@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {Bundle args = getArguments();String title = args != null ? args.getString(ARG_TITLE) : "";String message = args != null ? args.getString(ARG_MESSAGE) : "";return new AlertDialog.Builder(getActivity()).setTitle(title).setMessage(message).setPositiveButton("OK", null).create();}
}// 使用
CustomDialogFragment dialog = CustomDialogFragment.newInstance("标题", "消息内容");
dialog.show(getSupportFragmentManager(), "custom_dialog");

4. 对话框样式和主题

4.1 使用自定义主题

在styles.xml中定义:

<style name="CustomDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert"><item name="colorPrimary">@color/colorPrimary</item><item name="colorAccent">@color/colorAccent</item><item name="android:windowBackground">@android:color/transparent</item><item name="android:windowNoTitle">true</item>
</style>

使用主题:

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.CustomDialogTheme);

4.2 设置对话框宽度和动画

AlertDialog dialog = builder.create();
dialog.show();// 设置对话框宽度
Window window = dialog.getWindow();
if (window != null) {window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);// 设置动画window.setWindowAnimations(R.style.DialogAnimation);
}

5. 对话框生命周期管理

使用DialogFragment可以更好地管理对话框生命周期:

public class LifecycleDialogFragment extends DialogFragment {@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 初始化操作}@Overridepublic void onStart() {super.onStart();// 对话框显示时的操作}@Overridepublic void onDismiss(@NonNull DialogInterface dialog) {super.onDismiss(dialog);// 对话框关闭时的操作}@Overridepublic void onCancel(@NonNull DialogInterface dialog) {super.onCancel(dialog);// 用户按返回键或点击外部取消时的操作}
}

6. 最佳实践

  1. 优先使用DialogFragment:它比直接使用Dialog能更好地处理配置变更和生命周期
  2. 避免阻塞操作:不要在对话框按钮点击事件中执行耗时操作
  3. 保持简洁:对话框应专注于单一任务
  4. 考虑无障碍性:为对话框添加适当的内容描述和焦点管理
  5. 测试不同场景:包括旋转设备、低内存等情况下的对话框行为

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arinc818 fpga单色图像传输ip

arinc818协议支持的常用线速率如下图 随着图像分辨率的提高&#xff0c;单lane的速率无法满足特定需求&#xff0c;一种方式是通过多个LANE交叉的去传输图像&#xff0c;另外一种是通过降低图像的带宽&#xff0c;即通过只传单色图像达到对应的效果 程序架构如下图所示&#x…

透视投影(Perspective projection)与等距圆柱投影(Equirectangular projection)

一、透视投影 1.方法概述 Perspective projection&#xff08;透视投影&#xff09;是一种模拟人眼观察三维空间物体时的视觉效果的投影方法。它通过模拟观察者从一个特定视点观察三维场景的方式来创建二维图像。在透视投影中&#xff0c;远处的物体看起来比近处的物体小&…

三.微服务架构中的精妙设计:服务注册/服务发现-Eureka

一.使用注册中心背景 1.1服务远程调用问题 服务之间远程调⽤时, 我们的URL是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 缺点&#xff1a; 当更换机器, 或者新增机器时, 这个URL就需要跟着变更, 就需要去通知所有的相关服…

FPGA实现4K MIPI视频解码H265压缩网络推流输出,基于IMX317+VCU架构,支持4K60帧,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 MIPI 编解码方案我这里已有的视频图像编解码方案 3、详细设计方案设计框图FPGA开发板IMX317摄像头MIPI D-PHYMIPI CSI-2 RX Subsystem图像预处理Sensor …

Ollama+open-webui搭建私有本地大模型详细教程

Ollamaopen-webui搭建私有本地大模型详细教程 1. 什么是 Ollama&#xff1f; 1.1. Ollama 简介 ​ Ollama 是一个轻量级的 AI 模型运行时&#xff0c;专注于简化 AI 模型的部署和使用。它支持多种预训练模型&#xff08;如 Llama、Vicuna、Dolly 等&#xff09;&#xff0c;…

解决Centos7集成IDEA报git版本太低问题

Centos 7 服务器上默认安装的 Git 是 1.8.3.1 版本的 与最新的IDEA已无法匹配&#xff0c;需要更新 首先&#xff0c;卸载老版本 sudo yum -y remove git sudo yum -y remove git-*添加 End Point 到 CentOS 7 仓库 sudo yum -y install https://packages.endpointdev.com/r…

Qt常用宏定义判断大全

Qt 提供了一系列预定义宏用于判断 Qt 版本、操作系统平台、编译器特性等。这些宏在跨平台开发中非常有用。 1. Qt 版本判断宏 // 检查Qt版本 #if QT_VERSION > QT_VERSION_CHECK(5, 15, 0)// Qt 5.15.0及以上版本特有代码 #endif// 常用版本判断 #if QT_VERSION > QT_V…

实战 | 餐厅点餐小程序技术解析:SpringBoot + UniApp 高效开发指南

&#x1f5a5;️ 一、系统架构概览 1.1 技术选型 为了确保开发效率和系统稳定性&#xff0c;我们采用以下技术栈&#xff1a; 模块技术选型后台服务SpringBoot MyBatis-Plus MySQL用户端&#xff08;点餐小程序&#xff09;UniApp&#xff08;Vue 语法&#xff09;师傅端&…

实现在Unity3D中仿真汽车,而且还能使用ros2控制

文章目录 前言&#xff08;Introduction&#xff09;搭建开发环境&#xff08;Setup Development Environment&#xff09;在window中安装Unity&#xff08;Install Unity in window&#xff09;创建Docker容器&#xff0c;并安装相关软件&#xff08;Create Docker containers…

华为配置篇-BGP实验

BGP 一、简述二、常用命令总结三、实验 一、简述 IBGP 水平分割&#xff1a;从一个 IBGP 对等体学到的路由&#xff0c;不会再通告给其他的 IBGP 对等体。在一个 AS 内部&#xff0c;路由器之间通过 IBGP 交换路由信息。如果没有水平分割机制&#xff0c;当多个路由器之间形成…

Python视频标签工具详解:基于wxPython和FFmpeg的实现

在当今数字媒体时代&#xff0c;视频内容的管理和标记变得越来越重要。无论是研究人员需要对实验视频进行时间点标记&#xff0c;教育工作者需要对教学视频添加注释&#xff0c;还是个人用户希望对家庭视频进行分类整理&#xff0c;一个高效的视频标签工具都是不可或缺的。本文…

国产三维CAD「皇冠CAD」在汽车零部件领域建模教程:刹车片

本教程深度融合三维皇冠CAD&#xff08;CrownCAD&#xff09;的MBD&#xff08;Model-Based Definition&#xff09;设计理念&#xff0c;通过参数化建模、智能约束管理、动态装配验证等功能&#xff0c;实现数据驱动设计&#xff0c;精准解决了汽车制动系统中精密制动组件的设…

C#从入门到精通(3)

目录 第九章 窗体 &#xff08;1&#xff09;From窗体 &#xff08;2&#xff09;MDI窗体 &#xff08;3&#xff09;继承窗体 第十章 控件 &#xff08;1&#xff09;控件常用操作 &#xff08;2&#xff09;Label控件 &#xff08;3&#xff09;Button控件 &…

关于跨域与.NET的处理方案

在 Web 开发里&#xff0c;浏览器的同源策略是一项关键的安全机制。同源指的是两个 URL 的协议、域名和端口都相同。当浏览器从一个源&#xff08;域名、协议、端口&#xff09;的网页去请求另一个源的资源时&#xff0c;就会产生跨域问题。例如&#xff0c;从 http://www.exam…

react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析--react18

React 18 是一次重大的版本升级&#xff08;发布于2022年&#xff09;&#xff0c;引入了并发渲染&#xff08;Concurrent Rendering&#xff09; 和一系列新特性&#xff0c;旨在提升应用性能、用户体验和开发灵活性。 一、核心新特性 并发模式&#xff08;Concurrent Mode&a…

基于Spring Boot的平面设计课程在线学习平台系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Scala-面向对象

Scala 包 基本语法 package 包名 Scala 包的三大作用&#xff08;和 Java 一样&#xff09; 区分相同名字的类 当类很多时&#xff0c;可以很好的管理类 控制访问范围 包的命名、说明、对象 包的命名 命名规则 只能包含数字、字母、下划线、小圆点.&#xff0c;但不能用数字…

Excel 使用技巧:excel 合并不同列内容; excel 将公式转化为文本

Excel 使用技巧 目录 Excel 使用技巧excel 合并不同列内容="A:"&C1&"、B:"&D1&"、C:"&E1&"、D:"&F1excel 将公式转化为文本右键选择行粘贴某一列均填入“提示词”单击拖动双击某一列均填入“1”清除1…

【数字化转型,企业应用上云】---持续集成能力重塑企业软件交付新范式

在数字化转型浪潮中&#xff0c;软件交付的速度与质量已成为企业核心竞争力的关键。如何高效管理从代码开发到生产上线的全流程&#xff0c;实现开发与运维的无缝协作&#xff1f;如何通过自动化手段减少人为失误、加速迭代周期&#xff1f;我们出的研发效能管理平台&#xff0…

OpenCV图像形态学:原理、操作与应用详解

一、引言 图像形态学&#xff08;Image Morphology&#xff09;是图像处理领域的一个重要分支&#xff0c;它基于集合论、格论、拓扑学和随机函数理论&#xff0c;主要用于分析和处理图像的几何结构。形态学操作通过特定的结构元素&#xff08;Structuring Element&#xff09;…