Dialog实现原理分析
在 Android 中,对话框(Dialog)是一种非常常见的用户界面组件,用于向用户提供额外的信息或者请求用户的确认。Android 提供了几种不同类型的对话框,例如简单的消息对话框 (AlertDialog)、进度条对话框 (ProgressDialog) 等。其中最常用的是 AlertDialog,它可以通过 AlertDialog.Builder 来构建。
接下来,我将结合源码来分析 AlertDialog 的实现原理。
1. AlertDialog 类定义
AlertDialog 是一个继承自 Dialog 的类,而 Dialog 又继承自 Window,这使得 AlertDialog 可以作为一个独立的窗口出现在屏幕上。
1public class AlertDialog extends AppCompatDialog {
2 // ...
3}
2. 创建与配置
通常我们会使用 AlertDialog.Builder 来创建并配置一个 AlertDialog 对象。
1new AlertDialog.Builder(context)
2 .setTitle("标题")
3 .setMessage("这是一个消息对话框")
4 .setPositiveButton("确定", new DialogInterface.OnClickListener() {
5 public void onClick(DialogInterface dialog, int which) {
6 // 用户点击确定按钮后的操作
7 }
8 })
9 .setNegativeButton("取消", new DialogInterface.OnClickListener() {
10 public void onClick(DialogInterface dialog, int which) {
11 // 用户点击取消按钮后的操作
12 }
13 })
14 .show();
3. Builder 类
AlertDialog.Builder 是 AlertDialog 的静态内部类,它负责收集创建对话框所需的所有信息,并最终创建 AlertDialog 实例。
1public static class Builder {
2 private Context mContext;
3 private int mIconId;
4 private Drawable mIcon;
5 private CharSequence mTitle;
6 private int mTitleGravity;
7 private CharSequence mMessage;
8 private int mMessageGravity;
9 private List<Object> mListItems;
10 private List<CharSequence> mTexts;
11 private List<DialogInterface.OnClickListener> mOnClickListener;
12 private DialogInterface.OnClickListener mPositiveButtonListener;
13 private DialogInterface.OnClickListener mNegativeButtonListener;
14 private DialogInterface.OnClickListener mNeutralButtonListener;
15 // ...
16
17 public Builder(@NonNull Context context) {
18 this.mContext = context;
19 // ...
20 }
21
22 // 配置方法
23
24 public AlertDialog create() {
25 return new AlertDialog(this);
26 }
27}
4. 创建对话框
当调用 create() 方法时,AlertDialog 的构造函数被调用。
1public AlertDialog(@NonNull Builder builder) {
2 super(builder.mContext, builder.mTheme, builder.mCustomTitle == null ? 0 : R.style.Theme_AppCompat_Dialog_Alert);
3 // ...
4 // 设置各种属性
5 // ...
6 // 调用 onSetupWindow() 来完成初始化
7 onSetupWindow(this);
8}
5. onSetupWindow
onSetupWindow 方法负责进一步的设置,如添加视图到对话框。
1private void onSetupWindow(AlertDialog dialog) {
2 // ...
3 // 设置布局
4 // 设置监听器
5 // ...
6}
6. 显示对话框
show() 方法用于将对话框显示给用户。
1public void show() {
2 // ...
3 // 如果需要,创建对话框
4 if (mDialog == null) {
5 mDialog = create();
6 }
7 // 显示对话框
8 mDialog.show();
9}
7. 对话框布局
对话框的布局通常是通过 LayoutInflater 来创建的。
1LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
2View layout = inflater.inflate(R.layout.alert_dialog, null);
R.layout.alert_dialog 是一个预定义的布局文件,它定义了对话框的基本结构,包括标题、消息文本、按钮等。
8. 监听器
监听器(例如 OnClickListener)用于处理按钮点击事件。
1public void onClick(DialogInterface dialog, int which) {
2 // 用户点击按钮后的操作
3}
9. 主题和样式
AlertDialog 支持自定义主题和样式,可以通过 AlertDialog.Builder 的构造函数传入主题资源 ID。
1new AlertDialog.Builder(context, R.style.MyAlertDialogStyle)
2 // ...
3 .show();
10. 生命周期
AlertDialog 也遵循 Dialog 的生命周期,例如显示 (show())、隐藏 (hide())、销毁 (dismiss()) 等方法。
11. 结合源码总结
AlertDialog通过AlertDialog.Builder来构建和配置。- 对话框的布局是由系统提供的 XML 布局文件定义的。
AlertDialog支持多种按钮类型,如positiveButton,negativeButton,neutralButton,它们可以设置点击监听器。AlertDialog可以自定义主题和样式。
相关文章:
Dialog实现原理分析
在 Android 中,对话框(Dialog)是一种非常常见的用户界面组件,用于向用户提供额外的信息或者请求用户的确认。Android 提供了几种不同类型的对话框,例如简单的消息对话框 (AlertDialog)、进度条对话框 (ProgressDialog)…...
21.1 基于Netty实现聊天
21.1 基于Netty实现聊天 一. 章节概述二. `Netty`介绍三. 阻塞与非阻塞1. 阻塞与非阻塞简介2. BIO同步阻塞3. NIO同步非阻塞4. AIO异步非阻塞IO5. 异步阻塞IO(用的极少)6. 总结四. Netty三种线程模型1. 单线程模型2. 多线程模型3. 主从线程模型五. 构建Netty服务器************…...
尼卡音乐 v1.0.5 — 全新推出的免费音乐听歌软件
尼卡音乐是一款全新推出的免费音乐听歌软件,无需注册登录,打开即拥有全部功能。聚合了六大音源曲库、歌单、排行榜,支持在线试听、无损下载以及高清MV播放。资源全、无广告、更新快,适合寻找高品质音乐体验的用户。 拿走的麻烦评…...
Scratch深潜:解锁递归与分治算法的编程之门
亮眼标题:“Scratch深潜:解锁递归与分治算法的编程之门” 在编程的世界里,递归和分治算法是解决问题的强大工具。Scratch,这款广受儿童和初学者欢迎的图形化编程语言,以其独特的拖拽式编程块,激发了无数年…...
【1.0】vue3的创建
【1.0】vue3的创建 【一】vue3介绍 vue2的所有东西,vue3都兼容 vue3中写js代码由两种,组合式和配置项 配置项api,就是vue2的写法,将数据放进data,方法放进methods等 export default{data(){return {}},methods:…...
刷刷前端手写题
闭包用途 闭包 闭包让你可以在一个内层函数中访问到其外层函数的作用域 防抖 描述 前面所有触发都被取消,最后一次执行,在规定时间之后才会触发,也就是说如果连续快速的触发,用户操作频繁,但只会执行一次 。 常用场…...
论文解读:LONGWRITER: UNLEASHING 10,000+ WORD GENERATION FROM LONG CONTEXT LLMS
摘要 现象:当前的大预言模型可以接受超过100,000个tokens的输入,但是却难以生成超过2000个token的输出。 原因:监督微调过程(SFT)中看到的样本没有足够长的样本。 解决方法: Agent Write,可以将长任务分解为子任务&a…...
一文了解Ansible原理以及常见使用模块
ansible使用手册 1. 简述 Ansible 是一种开源的自动化工具,主要用于配置管理、应用程序部署和任务自动化。 它使用简单的 YAML 语言来定义自动化的任务【playbook】,使得配置和部署变得更加直观和易于管理。 基于SSH协议连接到远程主机来执行指令。 2…...
JavaEE从入门到起飞(九) ~Activiti 工作流
工作流 当一道流程逻辑需要用到多个表单的提交和多个角色的审核共同完成的时候,就可以使用工作流。 工作流一般使用的是第三方技术,也就是说别人帮你创建数据库表和service层、mapper层,你只需要注入工具接口即可使用。 原理:一…...
微服务的保护
一、雪崩问题及解决方案 1.雪崩问题 微服务之间,一个微服务依赖多个其他的微服务。当一个微服务A依赖的一个微服务B出错时,微服务A会被阻塞,但其他不依赖于B的微服务不会受影响。 当有多个微服务依赖于B时,服务器支持的线程和并…...
2024前端面试题-网络篇
1.跨域问题 同源策略:需要协议、域名、端口号相同跨域原因:不符合同源策略便会产生跨域问题解决跨域:JSONP、配置代理、通过CORS解决 2.RPC和HTTP的区别 主要区别是序列化和反序列化,RPC通过二进制高效传输,HTTP是j…...
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector
1.杨辉三角 . - 力扣(LeetCode) 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> arr;int i 0;int j 0;for (i…...
设计模式---简单工厂模式
简单工厂模式(Simple Factory Pattern) 是一种创建型设计模式,它定义了一个工厂类,通过这个工厂类可以创建不同类型的对象。简单工厂模式的主要目的是将对象的创建逻辑集中在一个地方,简化客户端的代码,使得…...
Vue | Vue 中的 refInForde 用法
refInFor:如果你在渲染函数中给多个元素都应用了相同的 ref 名,那么 $refs.myRef 会变成一个数组。 vue中的refInFor属性是Vue框架中用于在循环渲染的元素上设置引用的一种方式。 在Vue中,ref属性通常用于给元素或子组件注册引用信息&am…...
【原创】java+swing+mysql房屋租赁管理系统设计与实现
个人主页:程序员杨工 个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验 博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片,希望和大家…...
Django 中render、redirect 和 HttpResponse的区别
在 Python 的 Web 框架 Django 中,render, redirect 和 HttpResponse 是用于处理 HTTP 响应的不同函数,它们各自有不同的用途: HttpResponse: HttpResponse 是 Django 中最基本的响应对象,用于返回给客户端的 HTTP 响应…...
CRYPTO 2020
分类文章编号安全模型1-6公钥加密,功能加密,见证加密7-12后量子密码13-20密码分析21-31最佳论文32-34多方安全计算35-49真实应用50-55零知识证明56-62格和相关难题63-68泄露和外包加密69-74非交互式零知识证明,共识和延迟函数75-79构建80-85Security Models 1. Handling Ad…...
java 函数接口Consumer简介与示例【函数式编程】【Stream】
Java 8 中的 消费者接口Consumer 是一个函数接口,它可以接受一个泛型 类型参数,它属于java.util.function包。我们来看看Java函数接口库中的定义: FunctionalInterface public interface Consumer<T> {/*** Performs this operation o…...
黑神话:悟空-配置推荐
显卡推荐(按类别整理) 1. GTX 10系列、GTX 16系列: 如果希望体验光线追踪,建议根据预算升级到RTX 40系列显卡。对于1080p分辨率,至少需要RTX 4060才能流畅运行。 2. RTX 20系列: RTX 2060、RTX 2070&#…...
Android14 蓝牙设备类型修改
Android14 蓝牙设备类型设置修改设置 文章目录 Android14 蓝牙设备类型设置修改设置一、前言二、修改蓝牙设备类型1、蓝牙设备类型和对应的属性2、Debug设备设置和获取蓝牙设备类型3、系统源码中设置蓝牙设备类型4、Java代码中设置蓝牙prop属性可行吗? 三、其他1、A…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
