inflate()方法详解和源码分析

C++学习(四八二)zlib的inflate zlib 1.2.11 Manual https://www.zlib.net/manual.html 原理: ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initiali 阅读详情
在开发中,我们经常需要使用到LayoutInflater,通过该对象的inflate()方法,将一个layout布局文件实例化为View对象。

关于LayoutInflater对象的获取,参考博文:
http://blog.youkuaiyun.com/ruancoder/article/details/51760942

今天主要对inflate()方法的使用和源码进行分析。

(1).inflate()方法的使用

在实际使用中,我们一般会用到inflate的以下两个重载方法。


方法一:
public View inflate(int resource, ViewGroup root) {}

方法二:
public View inflate(int resource, ViewGroup root, boolean attachToRoot) {}

其中方法一最为常见。
常见使用案例一:
View myView = LayoutInflater.from(context).inflate(R.layout.my_view, null);
将布局文件/res/layout/my_view.xml实例化为myView对象。

常见使用案例二:
ViewGroup viewRoot;
LayoutInflater.from(context).inflate(R.layout.my_view, viewRoot);
将布局文件/res/layout/my_view.xml实例化的View对象添加到viewRoot布局中。

那么方法一与方法二有什么区别呢?
进入方法一的源码,我们会发现内部调用的其实就是方法二,只是将方法二的第3个参数设为“root != null”。
public View inflate(int resource, ViewGroup root) {
    return inflate(resource, root, root != null);
}

方法二中的参数和返回值释义:
参数:
resource:需要实例化的布局资源id。
root:ViewGroup类型视图组对象
attachToRoot:是否将resource实例化后的View添加到参数root中。
返回值:
如果root为空,直接返回resource实例化后的View对象;
如果root不为空,attachToRoot为true,将resource实例化为view对象,忽略view的最外层视图在xml布局中定义的属性,将view添加到root中,并将root返回。
如果root不为空,attachToRoot为false,将resource实例化为view对象,为view的最外层视图设置其在xml布局中定义的属性,并将view对象返回。

(2).inflate()方法的源码分析
进入inflate()方法内部。
public View inflate(int resource, ViewGroup root, boolean attachToRoot) {
    final Resources res = getContext().getResources();
    // 根据layout resource id,获取该布局的XmlResourceParser对象
    final XmlResourceParser parser = res.getLayout(resource);
    try {
        return inflate(parser, root, attachToRoot);
    } finally {
        parser.close();
    }
}
从方法内部可以看到,LayoutInflater使用的是pull解析器来解析xml布局文件的。获取到布局resource的XmlResourceParser对象后,接着进入下一个方法。

public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) {


    // ...


    // attrs是传入的布局layout在xml文件里面设置的属性集合
    final AttributeSet attrs = Xml.asAttributeSet(parser);


    // 将ViewGroup类型的参数root赋值给result
    View result = root;


    // temp是传入的参数resource的根布局View
    final View temp = createViewFromTag(root, name, inflaterContext, attrs);


    ViewGroup.LayoutParams params = null;


    // 实例化temp视图内的所有子视图
    rInflateChildren(parser, temp, attrs, true);


    if (root != null) {
        // 根据attrs属性集,创建布局参数params
        params = root.generateLayoutParams(attrs);
	// 如果temp不需要添加到root中,那么为temp设置布局参数params
        if (!attachToRoot) {
            temp.setLayoutParams(params);
        }
    }


    if (root != null && attachToRoot) {
        // 将temp添加到root中,并使用布局参数params
        root.addView(temp, params);
    }


    if (root == null || !attachToRoot) {
        // 将temp赋值给result(在此之前,result==root)
        result = temp;
    }


    // ...


    return result;
}
该方法是inflate()的关键,这里只抽取了需要关注的核心代码。

最开始,定义方法的返回值result,将参数root赋值给result,实例化参数resource赋值给temp。
接下来进入判断条件。
当root!=null时,根据resource的最外层view在xml中定义的的属性,创建布局参数params。如果!attachToRoot,为temp设置布局参数params。
当root!=null&&attachToRoot,将temp添加到root中,并使用上面创建的布局参数params。
当root==null||!attachToRoot,将temp赋值给result。
最后,将result返回。

逻辑看起来较繁琐,简单点可以这么理解。
只要root==null,无视attachToRoot的值,创建temp对象,返回temp。
当root!=null时,分两种情况。一,attachToRoot==true,将temp添加到root中,并使用布局参数params,返回root。二,attachToRoot==false,为temp设置布局参数params,返回temp。

(3).inflate()方法代码示例
在上面对inflate(int resource, ViewGroup root, boolean attachToRoot)方法的源码分析中,关于参数和返回值及其中的逻辑不难理解,主要是方法内是否为temp设置布局参数有些难以理解。下面使用代码示例进行说明。

创建MainActivity,并设置界面布局activity_main.xml。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"/>

新建一个textview.xml。这里故意给TextView的layout_width和layout_height设定了固定数值,并添加layout_gravity属性。方便后面看出差异。
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="230dp"
          android:layout_height="80dp"
          android:layout_gravity="center_horizontal"
          android:background="#999999"
          android:text="blog.youkuaiyun.com/ruancoder"
          android:textColor="#ffffff"
          android:textSize="18sp"/>

在MainActivity的onCreate()方法中,添加如下代码。
<pre name="code" class="java">package net.csdn.blog.ruancoder;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewGroup root = (ViewGroup) findViewById(R.id.layout);
        View textView = LayoutInflater.from(this).inflate(R.layout.textview, null);
        root.addView(textView);
    }
}


 运行效果图一:
然后,将onCreate()方法中的代码修改为如下:
ViewGroup root = (ViewGroup) findViewById(R.id.layout);
LayoutInflater.from(this).inflate(R.layout.textview, root, true);
或
ViewGroup root = (ViewGroup) findViewById(R.id.layout);
View textView = LayoutInflater.from(this).inflate(R.layout.textview, root, false);
root.addView(textView);
两种方式中的任意一种。

然后再看运行效果。

运行效果图二:


从图一的显示效果可以看出,我们为TextView设定的layout属性都失去了作用。而在图二中,这三个layout属性都正常显示出来了。


zlib-v1.3.1:递归压缩、解压文件 ZLIB和MiniZip简介与应用 ZLIB是一个通用的开源压缩库,采用deflate算法(结合LZ77和Huffman编码)实现高效数据压缩,广泛应用于存储优化和网络传输。MiniZip是基于ZLIB的轻量级ZIP文件处理库,支持ZIP文件创建、读取和修改,特别适合嵌入式系统和小型应用。两库均采用宽松的开源许可,提供C语言接口并支持跨平台使用。文中还介绍了Windows环境下ZLIB的编译方法,以及使用Qt开发简单的ZIP压缩/解压GUI程序的基本框架。 阅读详情

相关推荐

Android进阶之View.inflate和LayoutInflater.inflate方法区别

1 LayoutInflater   LayoutInflater用于加载布局的。加载布局的任务通常都是在Activity中调用setContentView()方法来完成的。其实setContentView()方法的内部也是使用LayoutInflater来加载布局的,只不过这部分源码是内部的。   我们先看下LayoutInflater的基本用法,首先需要获取到LayoutInflater的...

chenliguan的博客 1万+

USACO算法系列四——inflate

    题目:http://www.nocow.cn/index.php/Translate:USACO/inflate    这道题目类似于算法与数据结构当中的01背包问题,只是这里的物品有数量的问题。但是还是可以用动态规划解决问题。    我们假设f[type][minute]表示对前面type种题目在minute分钟下最大的得分情况。用struct Problem{ int point; int minute;}结构体数组表示题目类型和分数。则    当type>1时,f[type][minute]

止于至善 878

告别裸机SPI!用HAL库和CubeMX重新玩转STM32与MAX6675温度传感器

本文详细介绍了如何利用STM32CubeMX和HAL库高效驱动MAX6675温度传感器,实现稳定可靠的热电偶温度监测系统。通过图形化配置SPI接口和封装专用驱动函数,开发者可以快速构建嵌入式温度测量方案,适用于工业控制、物联网设备等多种应用场景。

weixin_42525632的博客 233

Inflate使用小结

Inflate小结 inflate 的两个调用方法 1. 使用View中的静态方法View.inflate() public static View inflate(Context context, @LayoutRes int resource, ViewGroup root) 2.使用LayoutInflater中的inflate()方法,在LayoutInflater类中有几个重载方法 public View inflate(@LayoutRes int resource, @Nullable Vi

鑫宇的博客 820

C#粘包和分包问题及解决方法

一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解:  下面对上面的图进行解释:  1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。  2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲...

weixin_42033401的博客 7767

BOSS直聘数据采集、解析处理、分析与可视化实战

招聘和求职是一对永恒的话题,不论什么时候都有招聘或者是求职的需求,找不找得到工作可能最主要的就是匹配度是否高,待遇福利是否诱人,如今互联网的快速发展,找工作的方式早已发生了翻天覆地的变化,从以往的面对面形式的招聘简历投递和面试方式,变成了电子简历网络直接投递、远程面试录用的形式,便捷性大大提升,需求的快速增长,促生了一批互联网招聘类的企业,诸如:51job、BOSS直聘、拉勾网等等,为了能...

Together_CZ的博客 9022

Android之 inflate() 方法总结

文章目录一、引言二、源码分析2.1 源码跟踪2.2 结论 一、引言 inflater.inflate(R.layout.layout_inflate_test,null); inflater.inflate(R.layout.layout_inflate_test, root,false); inflater.inflate(R.layout.layout_inflate_test, root,true); 做Android这么久,经常会看到上面三个方法,只知道这是通过布局资源id解析xml文件并返回Vi

tianyaluqingchen的博客 2160

Deepfake检测模型-PyDeepFakeDet项目复现实验报告-深度学习

该实验是对于https://github.com/wangjk666/PyDeepFakeDet模型的复现。PyDeepFakeDet 是一款集成的、可扩展的 Deepfake 检测工具。目标是提供最先进的 Deepfake 检测模型以及用于在常用 Deepfake 数据集上训练和评估新模型的接口。

一位不是很硕的鉴伪方向硕士 5494

Android --- View.inflate()的详细介绍

误用 LayoutInflater 的 inflate() 方法已经不是什么稀罕事儿了…… 做 Android 开发做久了,一定会或多或少地对布局的渲染有一些懵逼: 1.View.inflate() 和 LayoutInflator.from().inflate() 有啥区别? 2.调用 inflate() 方法的时候有时候传 null,有时候传 parent 是为啥? 3.用 LayoutInf...

梁同学与Android 1万+

OpenClaw实战系列04:Jira/Confluence深度集成实战指南

汇总 Confluence 空间 TEAM 下所有关于“性能优化”的文档,输出要点自然语言创建和查询 Jira 任务,无需离开聊天工具基于 Confluence 的私有知识库问答,让 AI 真正理解团队文档Jira 与 Confluence 联动,打通项目管理与知识管理定时同步与通知,自动化团队信息流转至此,你的 OpenClaw AI 助理已经不仅是一个聊天机器人,而是真正融入团队工作流的“智能项目管理助手”。下一期我们将带来OpenClaw 自定义技能开发实战。

PeterPan的博客 572

Windows 下 Hermes Agent(爱马仕)安装全记录:从零到一的保姆级图文教程

本文主要介绍了Windows 下 Hermes Agent(爱马仕) 安装全记录:从零到一的保姆级图文教程,希望能对学习使用 Hermes Agent 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装WSL环境 2.2 步骤二 安装Python环境 2.3 步骤三 安装Hermes Agent 2.4 步骤四 修正 API Key 错误 2.5 步骤五 配置多个模型 2.6 步骤六 启动Hermes Agent 3. 常见问题及解决方案 4. 总结

weixin_43178406的博客 14万+

View.inflate() 的前世今生

误用 LayoutInflater 的 inflate() 方法已经不是什么稀罕事儿了…… 做 Android 开发做久了,一定会或多或少地对布局的渲染有一些懵逼: View.inflate() 和 LayoutInflator.from().inflate() 有啥区别? 调用 inflate() 方法的时候有时候传 null,有时候传 parent 是为啥? 用 LayoutInfl...

lyglostangel的专栏 263

Test软件:Keysight二次开发_(1).Keysight软件开发概述

VISA(Virtual Instrument Software Architecture)库是Keysight提供的一种标准化的仪器控制接口,支持多种编程语言和开发环境。仪器通信:通过GPIB、USB、以太网等接口与仪器进行通信。数据采集:从仪器中获取测量数据。命令发送:向仪器发送控制命令。错误处理:处理通信过程中可能出现的错误。测试自动化是指通过编写脚本或程序来自动执行测试任务,从而提高测试效率和减少人为错误。Keysight的测试设备和仪器支持多种编程语言和开发环境,使得测试自动化变得相对容易。

2401_87715305的博客 1356

Android编程之LayoutInflater的inflate方法详解

LayoutInflater的inflate方法,在fragment的onCreateView方法中经常用到

xyz_fly的专栏 7万+

33、密码学中的选择密文攻击与Cramer - Shoup加密方案

本文详细介绍了密码学中选择密文攻击的背景及其对Cramer-Shoup公钥加密方案的影响。该方案在决策Diffie-Hellman假设和抗碰撞哈希函数的基础上,能够有效抵御自适应选择密文攻击,并且其安全性无需依赖随机预言机模型。文章还分析了Cramer-Shoup方案的设计原理、加密与解密过程,以及其在标准假设下的安全性证明方法。此外,通过一系列相关练习,帮助读者进一步理解密码学概念如密文不可区分性、ElGamal加密、Goldwasser-Micali方案等。最后,文章展望了密码学的未来发展趋势,包括量子

vscode6remote的博客 99

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LayoutInflater中inflate()方法的学习使用

LayoutInflater中inflate方法的源码学习

进击的小怪兽 775

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

View.inflate和LayoutInflater的inflate方法区别

平时ListView加载item中,adapter的getView方法中,我们经常用到: LayoutInflater.from(mContext).inflate(R.layout.it ,parent,false); 这样的方法来加载布局xml,平时一直就是这么用的,也没什么疑问。今天网上看了个自定义布局的源码,自定义布局中加载布局xml用的View.inflate方法: public cl

渴望飞翔的猪 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android自定义View开篇之(LayoutInflater.inflate()详解)

学习自定义View一段时间了,从开始的一窍不通到现在终于能写出点东西了,前面也写过几篇关于自定义view的博客,但是感觉这东西吧,一天不敲又忘记了,所以准备写一篇自定义View系列的博客,这也算是我这段时间学习自定义View总结的开篇,接下来还会有一系列的文章,支持我的朋友可以悄悄的点个赞,一起fighting!!! 既然是总结性的东西我们就要研究透一点,我们从源码看,不啰嗦了,开车了……首先获取

vv_bug 8612

Android inflate解析

对于inflate,我相信大家都不陌生,它的作用是将一个layout.xml布局文件变为一个View对象。尤其在ListView、GridView的Adapter中,我们继承BaseAdapter时必须重写的几个方法中有一个getView()方法,在这个方法中基本都会出现,使用inflate方法去加载一个布局,作为ListView、GridView的每个Item的布局。这篇博客就来分析一下Android中inflate的过程。

ITRenj的博客 6868

Fragment onCreateview()中Inflate()方法第二个参数,如何理解

Fragment onCreateview()中Inflate()方法第二个参数,如何理解?

syb001chen的博客 1353

android inflate 参数,Android inflate方法总结

前言inflater.inflate(R.layout.layout_inflate_test,null);inflater.inflate(R.layout.layout_inflate_test, root,false);inflater.inflate(R.layout.layout_inflate_test, root,true);看到上面这几个方法是不是非常眼熟,基本上做过Android...

weixin_40001924的博客 684

View绘制体系(二)——View的inflate详解

View绘制体系(二)——View的inflate详解 前言 上一篇博客讲到setContentView最后会调用mLayoutInflater.inflate来创建了自定义xml中的布局视图,添加到mContentParent中,这里我们就来学习下inflate的具体实现以及它的基本使用方法。 inflate的基本使用 首先我们需要明确的是,inflate方法是讲xml文件反射成一个View...

boyeleven的博客 4071

关于LayoutInflater.from(context).inflate()的使用的问题

在一般项目中使用adapter时,

ccfcccfc的专栏 4万+

LayoutInflater.inflate()详解

学习自定义View一段时间了,从开始的一窍不通到现在终于能写出点东西了,前面也写过几篇关于自定义view的博客,但是感觉这东西吧,一天不敲又忘记了,所以准备写一篇...

FadePeople 2257

【Android】布局优化:include、merge、ViewStub以及Inflate()源码浅析

Android布局复用与优化工具详解 本文介绍了Android开发中三种重要的布局工具: include:实现布局复用,可将公共组件封装成独立XML文件重复使用。使用时需注意设置不同ID,修改布局需重新定义宽高。 merge:优化布局层级,消除多余ViewGroup嵌套。适用于父容器与根布局类型相同的情况,使用时需注意其不能独立生成视图对象。 ViewStub:实现懒加载,减少初始化开销。仅在实际需要时加载视图,但需注意其只能inflate一次,且必须设置宽高。 三种工具各具特点,合理使用可有效提升布局复用

2401_87366139的博客 1220
上一篇: 更新UI的四种方式分析
下一篇: 购买栏悬浮效果实现
ruancoder
博客等级 码龄10年 42粉丝 66原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值