android - LayoutInflater.inflater的问题?
黄舟
黄舟 2017-04-17 17:36:02
0
2
443

新手,在看inflater的时候有点疑问
在LayoutInflater.inflater(int resId,ViewGroup root,boolean attchtoroot)这个方法中,
其中第三个参数是什么意思,什么时候用true,什么时候用false?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(2)
大家讲道理

简单的来说,如果每个View都需要一个LayoutParams来确定其布局位置,我们在Layout资源文件中进行的layout前缀的配置,基本都会记录在LayoutParams中。但是LayoutParams并不是根据当前View来生成的,而是根据父View来定义的。比如一个TextView存在于LinearLayout中,那么它拥有的就是基于LinearLayout.LayoutParams的LayoutParams,因为这样TextView才会拥有LinearLayout所特有的一些布局属性。
那也正是如此,当我们使用LayoutInflater.inflater从资源文件中加载View时,最上层的View是没有父View的,这时候我们在这个View中设置的layout系列参数就有可能应为采用了最基础的LayoutParams而丢失。为了保证不丢失参数,我们可以提供root,它就是一个父View的参考,表示我们使用的LayoutParams与root类所提供的LayoutParams一致。在通常情况下,我们就会给出载入的View即将加入的父View对象,这样一致性更容易保证。
而第三项attchToRoot其实就是一个快捷操作,表示在使用root作为参考时,也同时把View加入到root里,成为root的子View。在Android默认的重载中,我们提供root且不为空时,attchToRoot的值就是true,表示默认就把View加入到了root里。
虽然root和true是Android默认采用的方式,但通常我们不这么使用,因为LayoutInflater.inflater有个很特殊的返回方式,就是当我们传入的attchToRoot为true时,LayoutInflater.inflater会返回root而不是被载入的View本身。而在通常情况下,我们载入View都希望对View进行一些赋值等操作,也就是说我们更希望直接得到View本身。所以通常习惯的搭配是root配false这种方式,在对View赋值完成之后,在加入到root之中。

小葫芦

@有明 的答案不能更赞。
如果楼主需要查看更多内容,请阅读 官方文档

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal