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

Android LayoutInflater.from(context).inflate()方法的作用 前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"",感觉非常有意思,忍不住分享一下给大家。具体详情已经写在代码注释中。 阅读详情

      在一般项目中使用adapter时,加载item布局咱们一般会使用:

    LayoutInflater.from(context).inflate(R.layout.list_item, null);

      但这样你会发现编译器不希望你这样:Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element)

       而且你的xml的最外层布局的一些对于其父布局的一些诉求属性,不管怎么设置都不起作用。

比如这样一个item布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:layout_margin="50dp"
    android:gravity="center"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView1" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView2" />

</LinearLayout>

     用上述方法加载后结果发现


  android:layout_height="50dp"
    android:layout_margin="50dp"
    这两句没有效果。

   so,咱们来研究一下。

  网上流传了这样一篇文章,

http://www.doubleencore.com/2013/05/layout-inflation-as-intended/
点击打开链接

这是一个老外对inflate()的研究。

  其实他有很多个方法,但查看源码这些方法都殊途同归。

 我现在就说一下inflate(int resource, ViewGroup root, boolean attachToRoot)

第一个参数无需过多解释。

第二个参数指的是加载布局的root

Optional view to be the parent of the generated hierarchy (if attachToRoot is true), or else simply an object that provides a set of LayoutParams values for root of the returned hierarchy (ifattachToRoot is false.)

大概就是说如果后面attachToRoot为true的情况下,这个布局会被解析并加载在root下面,如果为false,则会依照root去解析该xml并返回view,但是这个view不会被加载到root里。

其实如果为false,就是讲xml解析了,并依照root的类型给生成的view set一个LayoutParams ,但不将其add到root里。

然后咱们看源代码里

LayoutInflater.from(context).inflate(R.layout.list_item, null);

 这个其实 是这样调用的: 

    public View inflate(int resource, ViewGroup root) {
        return inflate(resource, root, root != null);
    }
所以我建议将其写为

LayoutInflater.from(context).inflate(R.layout.list_item,root,false);
root就是加载这个view的父布局。

然后再在listview的adapter试一下,

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if (convertView == null) {
			convertView = LayoutInflater.from(context).inflate(
					R.layout.list_item, parent, false);
		}	

		return convertView;
	}


发现在listview里加载item的布局,


android:layout_height="50dp"
这句已经起到作用,但layout_margin无效果。

这是因为在listview里,convertview用的是viewgroup的 LayoutParams,所以线性布局的一些属性,例如layout_margin在解析的时候不起作用的。

为了验证一下,咱们在linearlayout中实验一下LayoutInflater

layout=(LinearLayout)findViewById(R.id.layout1);	
View view=LayoutInflater.from(this).inflate(R.layout.list_item,layout , false);
		layout.addView(view);


这样的话设置宽高和设置layout_margin都起到了作用。因为这时候view的layoutParams是LinearLayout.layoutParams的缘故,所以layout_margin果断会起到效果。

奥,对了,注意,在listview中不要将inflate(int resource, ViewGroup root, boolean attachToRoot)的attachToRoot设为true,

因为这样等于说让listview addview(convertView),但是listview不能加子控件,会报如下错误:

java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView

而在linearlayout里可以将inflate(int resource, ViewGroup root, boolean attachToRoot)的attachToRoot设为true,这样就相当于

View view=LayoutInflater.from(this).inflate(R.layout.list_item,layout , false);
		layout.addView(view);

最后附上demo下载地址http://download.youkuaiyun.com/detail/ccfcccfc/8142913点击打开链接






STM32--基于STM32F103C8T6的OV7670摄像头显示 使用 STM32F103C8T6 微控制器驱动 OV7670 摄像头模组,并将图像数据显示在屏幕上,是嵌入式系统中常见的图像采集与显示应用。OV7670 是一款 CMOS VGA 图像传感器,具有高灵敏度、低电压等特点,适用于嵌入式应用。而 STM32F103C8T6 是一款常用的 MCU 控制器,具有丰富的管脚资源和较高的工作频率。 阅读详情

相关推荐

PCIE6.0协议学习小记-Flit_Mode

PCIE6.0学习

code_aJack的博客 4637

一篇弄懂LayoutInflater.from(context).inflate()

昨天项目的原因,使用到了这个LayoutInflater.from(context).inflate(),结果发现应该加载的布局没有显示出来。排查了好久发现是照着别人view的时候,直接把LayoutInflater.from(context).inflate(R.layout.item, null)照写了,然后就没加载出来。所以今天整理一下昨天出现的问题。 LayoutInflater.from(context).inflate() 这个方法有几个重载方法,其中主要使用的参数简单的解释一下。 1..

mrkyee的博客 1万+

微信聊天记录丢失原因与恢复方案详解

SQLite数据库作为移动应用常见的本地存储方案,其加密机制和存储结构直接影响数据安全性。以微信为例,聊天记录存储在EnMicroMsg.db等SQLite文件中,采用AES加密保护。当手机清理工具误删这些文件时,会导致特定时间段记录丢失。理解数据恢复原理需要掌握文件系统删除机制和闪存特性,其中关键点包括TRIM指令的影响和数据块覆盖风险。通过专业工具如DiskDigger或iMyFone D-Back,配合ADB调试和SQLite数据重组技术,可在黄金时间窗口内恢复记录。日常维护建议结合自动化备份方案和存

weixin_32612263的博客 386

Android开发之LayoutInflater.from(context).inflate()方法参数介绍解决RecyclerView加载布局不全的问题

咱们先看下item的xml布局高度为64dp <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="64dp" android:layout_marginTop="1dp"

xiayiye5的博客 2270

告别黑盒调试:用MMSegmentation可视化工具链,从训练到评估一目了然

本文介绍了如何利用MMSegmentation的可视化工具链,从训练到评估实现语义分割模型的透明化调试。通过整合日志分析、混淆矩阵、PR曲线等工具,开发者可以快速定位模型问题,优化性能。文章详细展示了训练曲线分析、性能剖析、混淆矩阵解读和PR曲线应用等关键步骤,帮助用户告别黑盒调试,提升模型开发效率。

weixin_29100927的博客 104

4 轴穿越机 Mark5 机架全解析:从历史演进到电机桨叶选型指南

本文围绕 4 轴穿越机 Mark5 机架展开,先介绍其发展历程(2018 年初代到 2023 年五代,迭代优化轻量化、刚性与兼容性),再明确其核心参数(轴距 220mm、兼容 4-6 寸桨等)对电机桨叶的约束。 详解电机(KV 值、尺寸、推力等)与桨叶(尺寸、螺距、材质等)选型要点及匹配原则(高 KV 配小桨、低 KV 配大桨),给出推重比、功率等理论计算公式,结合新手练习、花飞、竞速、航拍等场景提供具体选型案例,最后提及安全、成本、法规等注意事项,为爱好者提供全面选型参考。

bother3000的博客 1900

app的listView排版一直出错

设置ListView时一直格式不对,xml的布局文件肯定是没错的 后来找了一下午,终于让姑奶奶给找到错在哪里了!! 接下来,找不同环节 if (convertView == null) { mViewHolder = new ViewHolder(); convertView = LayoutInflater.from...

aaqian1的博客 265

linux安装配置Mysql详细步骤

下载Mysql rpm包 官网下载:https://dev.mysql.com/downloads/mysql/ 如果你到了这里,本地应该有了如下四个rpm包: mysql-community-client-5.7.26-1.el6.x86_64.rpm mysql-community-common-5.7.26-1.el6.x86_64.rpm mysql-community-libs-5...

🏆 前端领域优质创作者 7万+

inflate 属性失效

 获得 LayoutInflater 实例的三种方式 1.LayoutInflater infalte=context.getSytemService(Context.LAYOUT_INFLATE_SERVICE); 2.LayoutInflater inflater = getLayoutInflater(); //调用Activity的getLayoutInflater() 3.LayoutI...

bobo的博客 534

AES加密算法及AES-CMAC原理白话版系统解析

对AES不同加密算法,加密模式,加密原理,填充算法及AES-CMAC算法的详细系统介绍,帮助大家对AES进行系统掌握。

initiallizer的博客 4068

MimicKit 人形机器人强化学习全身模仿控制算法使用教程

本文介绍了MimicKit运动模仿算法框架的使用指南。主要内容包括:1)安装IsaacGym和依赖项;2)训练模型命令及参数说明;3)测试模型的方法;4)分布式训练配置;5)使用TensorBoard可视化日志;6)动作数据格式说明。该框架支持DeepMimic、AMP、ASE、ADD等算法,包含PPO、AWR等强化学习算法,适用于物理仿真角色动画控制研究。

机器人控制与仿真应用 1201

RecycleView

item无法充满的问题 Adapter的Holder加载布局使用View会造成无法填充满,使用LayoutInflater。 填充不满 override fun onCreateViewHolder(p0: ViewGroup, p1: Int): BuilderRecyclerViewHolder { var view = View.inflate(context,R....

atomdu的专栏 280

UFS软件分区介绍

本文主要介绍了ufs软件分区管理的概况,能够使大家对软件分区有个大体的认识

肥匪斐's blogs 1万+

android中LayoutInflater.from(context).inflate的分析

在应用中自定义一个view,需要获取这个view的布局,需要用到 (LinearLayout) LayoutInflater.from(context).inflate(R.layout.contentitem, null); 这个方法。 一般的资料中的第二个参数会是一个null。通常情况下没有问题,但是如果我想给这个view设置一个对应的类,然后通过这个类来操作的话就会出问题。

云淡风轻的博客 8273

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

View.inflate() 和 LayoutInflater.from(context).inflate()区别

View.inflate()源码截图如下 LayoutInflater.from(context).inflate()源码截图如下: 你会发现下面这个方法实现的地方不一样罢了 LayoutInflater.from(context) View.inflate() 源码帮你实现了 LayoutInflater.

sweetzhangxue的博客 1033

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

View.inflate() 和LayoutInflater.inflate()的区别

前言: 既然在平淡的一天,也要坚持给自己找点乐趣。 在android开发中,根据布局文件生成View的情况咋们开发中是十分常见的,现在咋们分析下这这两个方法的区别 LayoutInflater.inflate() ? public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolea...

xueyoubangbang的博客 1096

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LayoutInflater 的使用方法、inflate() 方法的 attachToRoot 参数何时设置为 false?

每个 Activity 都有自己的 LayoutInflater 实例,每个 Activity 会在初始化时创建自己的 LayoutInflater 实例,存储在 Activity 的成员变量中。LayoutInflater 需要依赖上下文(Context)来加载资源(如布局文件、字符串等),LayoutInflater 提供 方法根据传入的 Context 对象获取 LayoutInflater 对象。在当前 Activity 中获取 LayoutInflater 时,可以直接使用本类的成员变量 Lay

weixin_42904738的博客 756

android service layoutinflater,Android LayoutInflater.from().inflate()源码解析

我们知道,在Activity#setContentView()中会调用PhoneWindow#setContentView()。而在PhoneWindow#setContentView()中有这么一句mLayoutInflater.inflate(layoutResID, mContentParent)。这行代码的作用是将我们的activity_main.xml填充到mContentParent中...

weixin_35034088的博客 401

View.inflate()和LayoutInflater.inflate()的区别

文章目录 一、LayoutInflater.inflate() 1. 获取LayoutInflater实例 2. LayoutInflater.inflate()的重载 二、 View.inflate() 三、总结 一、LayoutInflater.inflate() 该方法适用于所有布局填充的的场景,但使用前需要先实例化LayoutInflater对象 1. 获取LayoutInflater实例 getLayoutInflater(); 这个方法可以在..

az44yao的专栏 419

LayoutInflater和inflate()

LayoutInflater     LayoutInflater抽象类是用来加载XML布局文件(UI界面)的. 作用: 1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()或View.inflate()来载入,然后也可以通过findByIdView()获取界面的元素; 2、对于一个已经通过setContentView()载入的界面,就可以使用f

JakeyYe的博客 277

深入理解LayoutInflater.inflate()

LayoutInflater的使用形如 LayoutInflater.from(context).inflate(R.layout.test,root,true) 的使用在android开发中很常见,但许多人不但不清楚LayoutInflater的inflate()方法的细节,而且甚至在误用它。这里的困惑很大程度上是因为Google上有关attachToRoot(也就是inflate()方法第三个参

XuJiaoJie的博客 539

LayoutInflater和inflate()方法的用法

LayoutInflater作用是将layout的xml布局文件实例化为View类对象。 实现LayoutInflater的实例化共有3种方法, (1).通过SystemService获得     LayoutInflaterinflater = (LayoutInflater)context.getSystemServices(Context.LAYOUT_INFLATER_SERVI

4937

android layoutinflater原理分析,Android LayoutInflater inflate() 图示详解

之前在动态加载一个布局时用 View.inflate() 去加载,最后没加载出来,换为 LayoutInflater.from(mContext).inflate() 之后加载成功。具体场景我没记清了,但是我们可以通过了解这两个方式加载布局的方法来规避以后 使用可能出现的问题。既然是由 LayoutInflater.from(mContext).inflate() 引出的问题那就从怎么使用开始去一...

weixin_39638647的博客 212
上一篇: android 2.3 shortCut快捷方式创建与删除的问题
下一篇: 关于android的apk版本升级的一些建议
叫你一声逗比你敢答应吗
博客等级 码龄14年 2粉丝 6原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值