参考链接:郭神博客

Android下Activity中加载布局一般是通过setContentView()方法实现的,而setContentView()其实是通过调用LayoutInflater实现的。
要研究LayoutInflater原理,首先就要获取它的实例,有两种方法可以拿到LayoutInflater的实例:

//第一种方法
LayoutInflater inflater = LayoutInflater.from(context);
//第二种方法
LayoutInflater inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

其中方法一相当于对方法二进行了一次封装。
inflater的基本使用就不在详细说,直接放通过LayoutInflater加载按钮的代码:

public class MainActivity extends Activity {private LinearLayout mainLayout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mainLayout = (LinearLayout) findViewById(R.id.main_layout);LayoutInflater layoutInflater = LayoutInflater.from(this);View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null);mainLayout.addView(buttonLayout);}}

可以看到LayoutInflater是通过调用inflater实现功能的,那么inflater()是如何实现的呢?
inflater()其实有多个重载,不过最终都会调用到下面这个实现:

public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) {synchronized (mConstructorArgs) {final AttributeSet attrs = Xml.asAttributeSet(parser);mConstructorArgs[0] = mContext;View result = root;try {int type;while ((type = parser.next()) != XmlPullParser.START_TAG &&type != XmlPullParser.END_DOCUMENT) {}if (type != XmlPullParser.START_TAG) {throw new InflateException(parser.getPositionDescription()+ ": No start tag found!");}final String name = parser.getName();if (TAG_MERGE.equals(name)) {if (root == null || !attachToRoot) {throw new InflateException("merge can be used only with a valid "+ "ViewGroup root and attachToRoot=true");}rInflate(parser, root, attrs);} else {View temp = createViewFromTag(name, attrs);ViewGroup.LayoutParams params = null;if (root != null) {params = root.generateLayoutParams(attrs);if (!attachToRoot) {temp.setLayoutParams(params);}}rInflate(parser, temp, attrs);if (root != null && attachToRoot) {root.addView(temp, params);}if (root == null || !attachToRoot) {result = temp;}}} catch (XmlPullParserException e) {InflateException ex = new InflateException(e.getMessage());ex.initCause(e);throw ex;} catch (IOException e) {InflateException ex = new InflateException(parser.getPositionDescription()+ ": " + e.getMessage());ex.initCause(e);throw ex;}return result;}
}

通过代码我们很容易发现inflater()方法本质上是基于Pull方法去解析XML布局文件的。

从零开始理解Android下View(一)----学习笔记(参考郭霖大神博客)相关推荐

  1. 优秀Android博客大全,整理了国内外大神博客/Github地址,是学习Android进阶的首选[转]

    [转]国内外优秀Android博客大全,覆盖了国内外大神博客地址,Github地址,是学习Android进阶的首选 国内: 昵称 Github 博客 介绍 邓凡平   http://blog.csdn ...

  2. 吐血整理深度学习入门路线及导航【教学视频+大神博客+书籍整理】+【资源页】(2019年已经最后一个月了,你还不学深度学习吗???)

    声明: 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益, ...

  3. 升职加薪必看!撸了郭霖大神写的Framework源码笔记,醍醐灌顶!

    前言 2020年,互联网裁员潮下,我度过了人生中最清晰的半年. 今年我本命年,熬过了程序员35的坎,却在36岁被公司破产来了当头一棒,领完了当月份的工资,老板,也是我哥们的老李走进我的办公室,没有迂回 ...

  4. Android BLE开发 百度地图 大神博客简书传送门合集

    一.踩坑 踩坑1: 问题Q:方法报错.标红.Android Studio提示必须添加权限检查. 解决S:不用管,一样能够正常运行! 踩坑2: 问题Q:权限报错.标红.提示必须是系统应用才可以使用. 解 ...

  5. 国外大神一张图学会python-学习Python不得不关注和学习的国外大神博客

    注意 : 本文收集于网路 . 由于常常更新 , 有些链接打不开, 请自备梯子 在学习Python过程中,总会遇到各种各样的坑, 虽然Python是一门优美而简单易学的语言 . 但当学习后 , 总想着更 ...

  6. 撸了郭霖大神写的Framework源码笔记,Android篇

    前言 我们程序员之所以担心35岁被裁员,是因为自己的经验和实力能力不符合,国内IT现状,大多数程序员都在外包公司工作,框架老化,代码就是为了完成任务而写,刚定好需求你做一半产品突然让你改需求--一切的 ...

  7. Android(java)学习笔记176: 远程服务的应用场景(移动支付案例)

    一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...

  8. Android日常开发 - FlexboxLayout学习笔记

    Android日常开发 - FlexboxLayout学习笔记 Android日常开发使用FlexboxLayout实现流式布局的效果,FlexboxLayout与h5中的flex使用十分相似,都是将 ...

  9. 《深入理解LINUX内存管理》学习笔记(一)

    引子 为什么要写这个笔记: 1,这本书的中文版翻译了太垃圾,没法阅读.阅读英文原版,可以很好的理解作者的思路.作此笔记备忘 2,一直以来学习LINUX kernel的知识缺乏系统化,借对这本书的学习, ...

  10. 从零开始实现递归神经网络——【torch学习笔记】

    从零开始实现递归神经网络--[torch学习笔记] 引用翻译:<动手学深度学习> 从头开始实现一个语言模型.它是基于H.G.威尔斯的 "时间机器 "所训练的字符级递归神 ...

最新文章

  1. FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题--转...
  2. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十二)
  3. MySql 修改外键 支持级联删除
  4. drupal6 笔记
  5. linux耳机插拔检测,Android应用开发之耳机插拔处理两种方式
  6. 前端大神的离逝,让我们不得不有所反思。
  7. pyinstaller与anaconda python_Win10上Anaconda环境下python3.6安装和使用pyinstaller
  8. VC++设计简易计算器笔记(一)
  9. FastDFS服务器搭建
  10. 三维点云学习(5)4-实现Deeplearning-PointNet-1-数据集的批量读取
  11. 【Python3】待解决的疑问
  12. Groovy 设计模式 -- null对象模式
  13. 在Xen的DomU中安装MySQL
  14. 70 行 Python 代码写春联,支持行书隶书楷书!
  15. 【IOS账号分享】《帕斯卡契约》
  16. Unity3D 从 ipa 中提取游戏资源
  17. PHP2018人资面试题
  18. STM32F107VCTx HAL库 USART通信 DMA通信 友善串口调试助手 PL2303驱动安装
  19. linux rpm -qip命令,linux rpm命令
  20. [Pandas] DataFrame的columns属性

热门文章

  1. 最新鸽哒IM即时通讯系统源码+带安装教程
  2. EXCEPTION_ACCESS_VIOLATION异常
  3. 麦普奇医疗获得千万元A轮融资,投资方为达晨财智...
  4. 哪个学校计算机考研945,2018年郑州大学945软件工程专业基础综合考研复习资料...
  5. 超进化物语最新服务器,超进化物语新服无忧浅丛开服时间表_超进化物语新区开服预告_第一手游网手游开服表...
  6. 推荐一款团队协作软件---confluence
  7. 导读:如何通关自然语言处理面试
  8. 已解决:网易邮箱smtphz.qiye.163.com在阿里云环境发不出邮件的问题
  9. python求一元三次方程的根_方程的计算机处理924_Fortran
  10. asp.net mvc 实现判断用户是否登录的两种方式