前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >动态设置布局之LayoutInflater

动态设置布局之LayoutInflater

作者头像
Ant丶
发布于 2022-03-01 11:54:29
发布于 2022-03-01 11:54:29
1.1K00
代码可运行
举报
文章被收录于专栏:cayzlhcayzlh
运行总次数:0
代码可运行

动态设置布局之LayoutInflater

最近在做Android项目,也没有时间从头开始系统学一遍,大部分知识点只能一边做项目一遍积累。 今天在做一个需求写布局的时候在加藤同学的建议下使用RecyclerView来实现,在编码过程中接触到LayoutInflater这玩意,也算是第一次接触吧,整理下相关知识点。

什么是LayoutInflater

LayoutInflater是一个用于将xml布局文件加载为View或者ViewGroup对象的工具,我们可以称之为**布局加载器**。

layoutxml布局文件实例化为View类对象,LayoutInflater 的作用类似于 findViewById(),不同点是LayoutInflater是用来找layout文件夹下的xml布局文件,并且实例化!而 findViewById()是找具体某一个xml下的具体 widget控件(如:ButtonTextView等)。

获取方式

LayoutInflater本身是一个抽象类,不能直接通过new的方式来获取它的实例。

上代码:

第一种方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

第二种方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LayoutInflater inflater = LayoutInflater.from(context); 

第三种方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 在Activity内部调用getLayoutInflater()方法

这三种方式本质是相同的,从源码中可以看出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static LayoutInflater from(Context context) {
    LayoutInflater LayoutInflater =
            (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (LayoutInflater == null) {
        throw new AssertionError("LayoutInflater not found.");
    }
    return LayoutInflater;
}

Activity内部调用getLayoutInflater方法其实调用的是PhoneWindowmLayoutInflater

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public PhoneWindow(Context context) {
    super(context);
    mLayoutInflater = LayoutInflater.from(context);
}

这几个方法实际上殊途同归,都是通过调用ContextgetSystemService方法去获取。

获取到的是PhoneLayoutInflater这个实现类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Policy implements IPolicy {
    ...
    public LayoutInflater makeNewLayoutInflater(Context context) {
        return new PhoneLayoutInflater(context);
    }
}    

实例化View类对象

实例化LayoutInflater之后,就要将layoutxml布局文件实例化为View类对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
View view=inflater.inflate(R.layout.ID, null);

inflate方法

点击进入sdk源码,可以发现inflate方法有以下几个重载方法:

它们返回的值都是View对象。

其中 public View inflate (int resource, ViewGroup root) 最为常用。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); 
View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));   
//EditText editText = (EditText)findViewById(R.id.content);// error 
EditText editText = (EditText)view.findViewById(R.id.content);

指定了第二个参数 ViewGroup root,当然也可以设置为 null 值。

inflate方法的参数关系

  • root != null, attachToRoot == true 传进来的布局会被加载成为一个View并作为子View添加到root中,最终返回root; 而且这个布局根节点的android:layout_xxx参数会被解析用来设置View的大小;
  • root == null, attachToRoot无意义 当root为空时,attachToRoot无论是什么都没有意义。此时传进来的布局会被加载成为一个View并直接返回; 布局根View的android:layout_xxx属性会被忽略,即android:layout_xx属性只有依附在某个ViewGroup中才能生效
  • root != null, attachToRoot == false 传进来的布局会被加载成为一个View并直接返回。 布局根View的android:layout_xxx属性会被解析成LayoutParams并设置在View上,此时root只用于设置布局根View的大小和位置。

加载xml布局的原理

从根节点开始,递归解析xml的每个节点。

每一步递归的过程是:通过节点名称(全类名),使用ClassLoader创建对应类的实例,也就是View,然后,将这个View添加到它的上层节点(父View)。

同时会解析对应xml节点的属性作为View的属性。每个层级的节点都会被生成一个个的View,并根据View的层级关系add到对应的直接父View(上层节点)中,最终返回一个包含了所有解析好的子View的布局根View

参考资料

分享计划

博客内容将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/

许可协议

本文采用 署名-非商业性使用-相同方式共享 4.0 国际 许可协议,转载请注明出处。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
盘点分布式文件存储系统____分布式文件存储系统简介
**分布式存储:**通过网络使用企业中的每台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在企业的各个角落。
全栈程序员站长
2022/06/28
6.4K0
盘点分布式文件存储系统____分布式文件存储系统简介
五年五次飙榜,浪潮如此自我挑战为哪般?
要我说,中国本土的存储厂商当下最强悍的主力军,应该是Inspur了。这不,浪潮这次又登顶SPC-1了。
冬瓜哥
2021/07/22
4730
中国仅有两家入选,Gartner2021《分布式文件系统和对象存储魔力象限图》究竟有什么看点?
我们看到,戴尔和IBM作为老牌存储厂商,依然没有一点意外地牢牢盘踞在魔力象限图的最右上角。
科技云报道
2022/04/16
1.4K0
中国仅有两家入选,Gartner2021《分布式文件系统和对象存储魔力象限图》究竟有什么看点?
中移动分布式存储超级大单出炉,浪潮等唱主角
近日,中国移动公布了2019年至2020年分布式块存储产品集中采购招标公告。自2017年以来,中国移动已经组织了两次分布式文件存储集采,本次集采是电信运营商行业的首次分布式块存储大规模集采,吸引了众多包括浪潮、华为等在内的十多家厂商参与投标。最终,浪潮在为期5个月的测试中率先完成测试,并且凭借过硬的产品实力,勇夺综合成绩第一。
大数据在线
2019/11/11
6090
中移动分布式存储超级大单出炉,浪潮等唱主角
Gartner:浪潮存储进入分布式存储前三
近日,权威调研机构Gartner公布2021二季度全球存储市场报告。报告显示,全球存储市场开始回暖,市场规模同比增长3.5%,其中以分布式存储为代表的第二存储市场增速最高,同比增长5.5%。全球第二存储市场,浪潮分布式存储增长强劲,市场份额保持全球前三。
大数据在线
2021/10/27
6910
难言之隐,分布式存储软硬件解耦究竟难在哪里?
说到分布式存储,我们可能都会联想到软件定义存储(Software Defined Storage,即SDS)。代表全球存储厂商的权威协会SNIA(全球网络存储工业协会)对SDS定义:软件定义存储包括管理面的标准接口和自动化,以及数据面Scale-out的块、文件和对象存储服务。 业界很多分析师和厂商都认为“SDS”应该和硬件解耦,可以部署在容器、虚拟机、标准裸金属服务器上。 但在上述SNIA发布的SDS白皮书中,SNIA并不认同这种观点,而是更关心SDS实现管理面的自动化和数据面的弹性。 分布式存储“软
云头条
2022/03/18
6660
百亿产业规模之后,中国分布式存储市场有哪些重要趋势?
过去十年里,数字经济的蓬勃发展,不仅带来了数据爆炸性增长,也让数据的重要性日渐突显。
大数据在线
2022/12/13
4220
百亿产业规模之后,中国分布式存储市场有哪些重要趋势?
分布式存储会一统存储市场吗 ?
近年来,随着云、大数据、AI、区块链等技术的发展,分布式架构在IT市场持续火热,在存储领域,分布式存储蓬勃发展。 其中在AI应用最火热的汽车自动驾驶研发领域,每个车企都需要对数百PB数据进行采集、存储、分析训练、仿真。 根据预测,到2025年全球数据将增长到175ZB,其中非结构化数据占比将超过80%,分布式存储凭借高扩展性和易管理能力,成为承载海量数据的重要选择。同时,在政府、运营商、金融等大规模云化数据中心,各大云厂商、分布式存储厂商都在积极推动分布式存储更广泛地应用,替代部分传统存储阵列。 种种迹象
云头条
2022/03/18
6260
块存储、文件存储、对象存储这三者和分布式文件存储系统的本质区别[通俗易懂]
https://blog.csdn.net/enweitech/article/details/51445087
全栈程序员站长
2022/09/01
10.6K0
开源分布式文件系统大检阅
我们的YRCloudFile是一款面向云时代的分布式文件系统,它的主要特点是支持海量小文件的高性能数据访问,对Kubernetes平台的无缝支持,混合云场景下的数据支撑。我们在开发YRCloudFile时,也会去了解业界主流的分布式文件系统,学习其优点,避免其缺点。本文讨论几个我们曾调查过的主流的分布式文件系统,它们都是开源系统,因为这样能收集到丰富的资料,能看到代码,使得了解及讨论更为清晰。
焱融科技
2020/04/02
1.8K0
开源分布式文件系统大检阅
CubeFS 进入 CNCF 孵化阶段,国产分布式存储的新里程碑!| Q推荐
CubeFS 是国内首个云原生开源分布式存储产品,2019 年开源并捐赠托管至云原生计算基金会 (CNCF),2020 年 10 月 OPPO 开始主导 CubeFS 社区运营与版本迭代,累计发布 7 个 release 版本。在 OPPO 的全力推进下,CubeFS 于 2022 年 6 月进入 CNCF 孵化阶段。 本文,我们与 CubeFS Maintainer OPPO 的何小春进行了对话,共同探讨 CubeFS 的技术演进及云原生存储技术的发展方向。 1 云原生存储技术“越来越分布式” 随着云
深度学习与Python
2023/03/29
1.1K0
CubeFS 进入 CNCF 孵化阶段,国产分布式存储的新里程碑!| Q推荐
挑战存储“不可能之三角”:用自研技术引领存储性能突破
然而,随着非结构化数据在生产业务中的广泛应用,各行各业正在经历数据量的爆炸式增长。虽然分布式存储在大众认知内具有高性价比和高扩展性,却未被赋予高性能的标签。
科技云报道
2024/01/10
3080
挑战存储“不可能之三角”:用自研技术引领存储性能突破
QingStor分布式存储,或成为青云科技上市后的新增长引擎
继青云科技(QingCloud)上市以来,旗下分布式存储品牌QingStor近日也官宣了新的品牌征程:
科技云报道
2022/04/16
4210
QingStor分布式存储,或成为青云科技上市后的新增长引擎
【重识云原生】第三章云存储第一节——分布式云存储总述
在了解什么是分布式存储之前,我们先来简单了解一下存储几十年来的大概历程。
江中散人_Jun
2022/04/11
2.4K0
【重识云原生】第三章云存储第一节——分布式云存储总述
Ceph分布式存储初步认识(一)
Ceph 是一个去中心化的分布式存储系统, 提供较好的性能、可靠性和可扩展性。 Ceph 项目最早起源于Sage就读博士期间的工作(最早的成果于 2004 年发表),并随后贡献给开源社区, 遵循 LGPL 协议 (LESSER GENERAL PUBLIC LICENSE 的简写,中文译为 “ 较宽松公共许可证 ” )。在经过了数年的发展之后,目前已得到众多云计算厂商(OpenStack 、 CloudStack 、 OpenNebula 、 Hadoop )的支持并被广泛应用。
Lansonli
2022/04/11
1.3K1
Ceph分布式存储初步认识(一)
GlusterFS分布式存储学习总结
分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源并不直接与本地节点相连,而是分布于计算网络中的一个或者多个节点的计算机上。目前意义上的分布式文件系统大多都是由多个节点计算机构成,结构上是典型的客户机/服务器模式。流行的模式是当客户机需要存储数据时,服务器指引其将数据分散的存储到多个存储节点上,以提供更快的速度,更大的容量及更好的冗余特性。 目前流行的分布式文件系统有许多,如MooseFS、FastDFS、GlusterFS、Ceph、Mogile
洗尽了浮华
2018/04/17
2.9K0
GlusterFS分布式存储学习总结
YH10:分布式存储解决方案zData
云和大数据时代的到来导致各行各业数据量的爆发,面对业务数据的日益剧增,企业的IT系统在性能、稳定性和扩展性等方面都面临前所未有的巨大挑战。如何有效应对云和大数据的浪潮去拥抱变化,成为企业迫切面临的问题。 数据驱动的时代,一切竞争的核心都会归结于IT系统的竞争,然而传统数据库系统架构面临以下困境: 1、中心化的存储系统成为I/O存取的瓶颈,扩展成本高昂 2、小型机+高端存储,成本高昂,相对比较封闭,扩展能力差。 3、复杂的系统带来部署及操作、运维和管理的复杂性 分布式存储解决方案zData 为更好地保障企业
数据和云
2018/03/07
1.7K0
YH10:分布式存储解决方案zData
分布式文件存储选型比较[通俗易懂]
在这个数据爆炸的时代,产生的数据量不断地在攀升,从GB,TB,PB,ZB.挖掘其中数据的价值也是企业在不断地追求的终极目标。但是要想对海量的数据进行挖掘,首先要考虑的就是海量数据的存储问题,比如Tb量级的数据。
全栈程序员站长
2022/06/28
7500
分布式文件存储选型比较[通俗易懂]
大数据开发:分布式文件存储系统简介
在分布存储式存储技术体系当中,分布式文件存储是其中的分类之一,也是大数据架构当中常常用到的。得益于Hadoop的高人气,Hadoop原生的HDFS分布式文件系统,也广泛为人所知。但是分布式文件存储系统,并非只有HDFS。今天的大数据开发分享,我们就主要来讲讲常见的分布式文件存储系统。
成都加米谷大数据
2021/01/13
1.5K0
大数据开发:分布式文件存储系统简介
刘军:18年“老兵”眼中的HPC与大数据、深度学习的融合
关注高性能计算(HPC)的朋友们不会忘记今年7月第45期全球超级计算机TOP500排名,中国国防科学技术大学研制,部署于中国广州超算中心的天河二号再次荣登榜首,连续第5次成为TOP500冠军。这还是在
CSDN技术头条
2018/02/09
1.2K0
刘军:18年“老兵”眼中的HPC与大数据、深度学习的融合
推荐阅读
相关推荐
盘点分布式文件存储系统____分布式文件存储系统简介
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档