当前位置: 首页 > news >正文

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.BuilderAlertDialog 的静态内部类,它负责收集创建对话框所需的所有信息,并最终创建 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 支持多种按钮类型,如 positiveButtonnegativeButtonneutralButton,它们可以设置点击监听器。
  • AlertDialog 可以自定义主题和样式。
http://www.lryc.cn/news/430214.html

相关文章:

  • 21.1 基于Netty实现聊天
  • 尼卡音乐 v1.0.5 — 全新推出的免费音乐听歌软件
  • Scratch深潜:解锁递归与分治算法的编程之门
  • 【1.0】vue3的创建
  • 刷刷前端手写题
  • 论文解读:LONGWRITER: UNLEASHING 10,000+ WORD GENERATION FROM LONG CONTEXT LLMS
  • 一文了解Ansible原理以及常见使用模块
  • JavaEE从入门到起飞(九) ~Activiti 工作流
  • 微服务的保护
  • 2024前端面试题-网络篇
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector
  • 设计模式---简单工厂模式
  • Vue | Vue 中的 refInForde 用法
  • 【原创】java+swing+mysql房屋租赁管理系统设计与实现
  • Django 中render、redirect 和 HttpResponse的区别
  • CRYPTO 2020
  • java 函数接口Consumer简介与示例【函数式编程】【Stream】
  • 黑神话:悟空-配置推荐
  • Android14 蓝牙设备类型修改
  • vue3 语法糖<script setup>
  • 微服务设计原则——高性能:异步与并发
  • 机器学习——决策树,朴素贝叶斯
  • C语言基础(十)
  • 人像比对-人证比对-人脸身份证比对-人脸身份证实名认证-人脸三要素对比-实人认证
  • Android 上下滑隐藏显示状态栏
  • USBCAN-II/II+使用方法以及qt操作介绍
  • 笔记-系统规划与管理师-案例题-2022年-IT服务部署实施
  • Kubernetes 清理资源常用的 Kubernetes 清理命
  • 【数据结构初阶】二叉树--基本概念
  • Pytorch添加自定义算子之(12)-开闭原则设计tensorrt和onnxruntime推理语义分割模型