1.setContentView流程分析

news2024/11/28 11:56:01

1. setContentView初步分析之继承自Activity
我们创建的MainActivity继承自Activity,在代码中使用setContentView(R.layout.activity_main),查看他在Activity中的源码如下:

public void setContentView(@LayoutRes int layoutResID) {
    //这里的getWindow方法获取到一个PhoneWindow实例,然后再分析PhoneWindow中的setContentView方法
    getWindow().setContentView(layoutResID);
    initWindowDecorActionBar();
}

这里的getWindow方法,获取到的其实是一个PhoneWindow的实例,通过Activity.java中的attach()方法中创建的mWindow对象,代码如下:

mWindow = new PhoneWindow(this, window, activityConfigCallback);

然后我们再从PhoneWindow.java中分析setContentView方法,而setContentView方法主要有两个目的(作用):

  1. 创建DecorView/FrameLayout,然后创建mContentParent/ViewGroup(Root对象)
    • installDecor()->generateDecor()->new DecorView()->mDecor->generateLayout(mDecor)->mContentParent
  2. 解析我们的布局文件,利用反射创建View对象
    • mLayoutInflater.inflate(layoutResID, mContentParent);
    1. 创建rootView
      • ->创建布局的rootView(比如一个xml布局文件是以ConstrantLayout作为根布局)
        crateViewFromTag()
        ->onCreateView()/createView()
        ->PhoneLayoutInflater.onCreateView()
        ->PhoneLayoutInflater.createView()
        ->LayoutInflater.createView()
        ->通过反射创建View并返回
        clazz = Class.forName(解析到的控件全路径,classLoader);
        然后通过clazz获取到构造器,最后根据构造器创建出view对象
    2. 创建子View
      • rInflateChildren(parser, temp, attrs, true);
        ->rInflate(parser, parent, parent.getContext(), attrs, finishInflate);迭代遍历while循环
        ->createViewFromTag(parent, name, context, attrs);
        后面的流程同上面创建rootView流程中接createViewFromTag后面的流程

面试题: LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)中参数的作用是什么?

  1. resource 子控件的布局文件
  2. root 父容器
  3. attachToRoot 逻辑判断,是否可以将子控件resource添加到父容器root中去
  • root非空,并且attachToRoottrue,则可以将第一个参数中的布局文件resource添加到父容器root中去
  • root为空,或者attachToRootfalse,则可以将第一个参数中的布局文件resource创建的View返回

流程图如下:
在这里插入图片描述

哪些地方可以创建PhoneWindow?

  1. Activity
  2. Dialog
  3. PopupWindow
  4. Toast

如何布局?使用 mLayoutInflater.inflate(layoutResID, mContentParent);
使用XMLResourceParser解析,传入的参数mContentParent就是root对象,然后调用rInflate方法或者是调用rInflateChildren方法,正常情况下是调用rInflateChildren方法,但是rInflateChildren方法又会去调用rInflate方法,最终返回一个View

2. setContentView初步分析之继承自AppCompatActivity(继承自FragmentActivity)
我们创建的MainActivity继承自AppCompatActivity,在代码中使用setContentView(R.layout.activity_main),查看他在AppCompatActivity.java中的源码如下:

public void setContentView(@LayoutRes int layoutResID) {
    //delegate是代理的意思,为了实现版本兼容
    //这里的getDelegate返回的是一个AppCompatDelegateImpl类对象,然后在AppCompatDelegateImpl.java类中分析setContentView的方法
    getDelegate().setContentView(layoutResID);
}

这里的getDelegate()方法返回的是AppCompatDelegateImpl对象的实例,然后在AppCompatDelegateImpl.java类中分析setContentView的代码,源码如下:

public void setContentView(int resId) {
    //通过这个方法创建mSubDecor/ViewGroup;创建DecorView,创建mContentParent;
    //迁移旧的布局文件中的控件到新的布局文件中,替换content为新的布局文件中的ID
    ensureSubDecor();
    //找到新的布局文件中的控件ID
    ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);
    contentParent.removeAllViews();
    LayoutInflater.from(mContext).inflate(resId, contentParent);
    mAppCompatWindowCallback.getWrapped().onContentChanged();
}

首先调用ensureSubDecor()方法创建mSubDecor对象实例(他是一个ViewGroup对象),代码如下:
mSubDecor = createSubDecor();
然后在createSubDecor()方法中,会调用如下两行代码:

ensureWindow();
mWindow.getDecorView();

第二行代码中就会执行创建DecorViewmContentParent对象的操作;
然后创建subDecor局部变量,并把他作为这个方法的返回值返回给mSubDecor对象;
subDecor引入的布局问文件是R.layout.abc_screen_simple,
为了版本兼容,将screen_simple.xmlcontent下面的控件迁移过来,同时移除screen_simple.xmlcontent下面的控件;
然后将sceen_simple.xml文件中id值为content置为空,同时将abc_screen_simple.xml文件中的id更改为content(这个content原本是sceen_simple.xml文件中的id);
达到将旧版本中的布局控件迁移至新版布局文件和contentid兼容的目的;
然后将subDeocr赋值给PhoneWindow,代码如下:
mWindow.setContentView(subDecor);
然后就会执行PhoneWindow.java中的setContentView方法,同Activity中逻辑类似,这里就会执行创建decorView,接着会返回mContentParent对象
流程图如下:
在这里插入图片描述

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

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

相关文章

什么是好代码/坏代码?给普通人的图解示例

本文翻译自国外论坛 medium,原文地址:https://medium.com/todbotts.triangles/what-is-good-bad-code-an-illustrated-example-for-non-programmers-1222b600a0f0 我曾经在某个地方读到过一句话,基本上有以下内容: 在现代世界中&a…

算法(一)—— 回溯(3)

文章目录 1 78 子集2 90 子集II3 491 递增子序列 子集问题 1 78 子集 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题是收集树的叶子节点,而子集问题是找树的所有节点! 因为需要找到所有的节点&#xff0…

JavaEE(系列一 )-- 计算机是如何进行工作的

目录 1. 操作系统 2. 进程/任务(Process/Task) 2.1 进程 2.2 进程管理 2.2.1 进程的结构体 2.2.2 进程调度 2.3 并行 和 并发 2.4 内存分配 -- 内存管理(Memory Manage) 2.5 进程间通信 3. 线程 1. 操作系统 操作系统是一组做计算机资源管理的软件的…

谷歌I/O大会重磅发布:Bard编码能力优化后仍不支持中文,开发者选择CodeGeeX更佳

谷歌I/O大会今天凌晨发布,打出系列AI组合拳。除了发布升级版语言模型PaLM2之外,Bard能力也要起飞。 凭借改进的数学、逻辑和推理技能,Bard 现在可以帮助生成、解释和调试 20 多种编程语言的代码,开发者们需要输入prompt&#xff0…

C#从入门到入坟(原创不易,转载请注明出处)

文章目录 C# 基础篇0 环境部署1 Hello world1.1 两种框架1.2 创建项目的过程1.3 项目组成结构1.3.1 解决方案和项目1.3.2 程序集信息1.3.3 引用1.3.4 配置文件1.3.5 程序入口类 1.4 解决方案1.5 Debug 和 Release1.6 CSharp虚拟机初始1.7 .Net Framework混合语言开发1.8 托管代…

上下文感知的体素对比学习用于标签高效的多器官分割

文章目录 Context-Aware Voxel-Wise Contrastive Learning for Label Efficient Multi-organ Segmentation摘要本文方法有监督损失Context-Aware Contrastive Learning Loss for Unlabeled Voxels 实验结果 Context-Aware Voxel-Wise Contrastive Learning for Label Efficient…

GSMA-eSIM-官网规范说明

GSMA | eSIM Consumer and IoT Specifications - eSIM GSMA | eSIM Consumer and IoT Specifications - eSIMhttps://www.gsma.com/esim/esim-specification/ 架构、测试、技术规范 3.0版本 测试套件 EID的定义和分配 GSMA EID Definition and Assignment 合规性规范 自我评…

第十四届蓝桥杯青少组模拟赛Python真题 (2023年2月12日),包含答案

第十四届蓝桥杯青少组模拟赛Python真题 (2023年2月12日) 一、选择题 第 1 题 单选题 关于Python3.10,下列选项描述正确的是 ( )。 答案:B 第 2 题 单选题 下列数据类型中,哪一个是不可变的?() 答案:B 第 3 题 单选题 以下关于函数参数描述正确的是 ()。 答案:D 第 …

【JAVAEE】文件操作——IO

目录 💋1. 冯诺伊曼体系 🐷2. 内存与外存的区别 ✨3. 文件 🎁3.1 认识文件 ✌3.2 文件的管理 🍳3.3 文件路径 🎃3.4 文件的保存 👑3.4.1 文本文件 📷3.4.2 二进制文件 🎀3.5 文件系…

Python基本数据类型之一——set(集合)

Python基本数据类型之一——set(集合) 一、python集合定义 集合(set)是一个无序不重复元素的序列。基本功能是进行成员关系测试和删除重复元素。 二、创建方式 在Python中,创建集合有两种方式: 一种是用一对大括号将多个用逗号分隔的数据括起来。 另一种…

Vue3-黑马(九)

目录: (1)vue3-antdv-删除选中 (2)vue3-进阶-antdv-增改 (3)vue3-进阶-antdv-增改2 (1)vue3-antdv-删除选中 我们在表格中在加一列,做一个复选框&#xff…

【一起啃书】《机器学习》第六章 支持向量机

文章目录 第六章 支持向量机6.1 间隔和支持向量6.2 对偶问题6.3 核函数6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 一些问题 第六章 支持向量机 6.1 间隔和支持向量 给定训练样本集 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , …

【YOLO系列】--YOLOv4超详细解读/总结

YOLOv4(YOLOv4: Optimal Speed and Accuracy of Object Detection)(原文+解读/总结+翻译) 系列文章: YOLOv1论文解读/总结_yolo论文原文_耿鬼喝椰汁的博客-CSDN博客 YOLOv2论文解读/总结_耿鬼…

[免疫学]抗原递呈详解

目录 🧫1. 抗原递呈是什么 🧫1.1 MHCⅠ类分子 🧫1.2 MHCⅡ类分子 🧫1.3 MHCⅠ类分子 分子介导的抗原递呈 🧫1.4 MHCⅡ类分子 分子介导的抗原递呈 🧫1.5 抗原递呈细胞 🧫1.5.1 激活的树突状…

初识Linux篇:第三篇

初识Linux篇:第三篇 初识Linux篇:第三篇1.Linux中常见的通配符1.1*号通配符1.2 ?通配符1.3[ ]通配符1.4{ }通配符 2.man指令3.cp指令4.mv指令5.alias指令6. echo指令7.cat指令8.more指令9.less指令10.head与tail指令11.在Linux中写代码 总结 …

DHCP中继负载均衡使用原理

DHCP常用四种报文 基于UDP67服务端, 68端口客户端 discover 广播 offer 单播 rquest 广播 ack 单播 DHCP 50%时间续租时request报文为单播报文 DHCP 87.5%时间请求重新绑定IP时request报文为广播报文 DHCP的另类配置方案: 负载均衡: ip re…

【Python_Pandas】reset_index() 函数解析

【Python_Pandas】reset_index函数解析 文章目录 【Python_Pandas】reset_index函数解析1. 介绍2. 示例2.1 参数drop2.2 参数inplace2.3 参数level2.4 参数col_level2.5 参数col_fill 参考 1. 介绍 pandas.DataFrame.reset_index reset_index(levelNone, dropFalse, inplaceF…

【AI大模型智慧办公】用《文心一言》1分钟写一篇博客简直yyds

文章目录 前言文心一言是什么文心一言可以做什么文心一言写博客申请体验写在最后 前言 当今社会,博客已成为了许多人分享观点、知识和经验的重要平台。用文心一言写博客是将自己的思考、想法和经验以文字的形式呈现出来,让更多人了解自己。通过写博客&a…

【Python入门】Python循环语句(while循环的基础语法)

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

【计网】第三章 数据链路层(4)局域网、以太网、无线局域网、VLAN

文章目录 3.6-1 局域网基本概念和体系结构一、局域网二、局域网基本概念和体系结构三、局域网传输介质四、局域网介质控制方法五、局域网分类六、IEEE 802 标准七、MAC 子层和 LLC 子层总结: 3.6-2 以太网一、以太网概述二、以太网提供无连接、不可靠的服务三、以太…