Layout Inflation
2015-08-11 09:05
246 查看
框架中的示例
获取LayoutInflater对象有三种方法
关于LayoutInflater类inflateint resource ViewGroup root boolean attachToRoot方法三个参数的含义
参考
Layout inflation在Android上下文环境下转换XML文件成View结构对象的时候需要用到。
Fragment也会用到inflation操作,通过onCreateView()方法创建view的时候会用到。这个方法的签名是这样的:
1. 不知你有没有注意到这一点,每次Framework需要你去载入一个布局文件时,都会传入一个ViewGroup参数(最后需要绑定到的根视图),如果Layoutinflater设为自动绑定到根视图的话,会抛出一个异常。
2. 所以你想想看,如果我做绑定操作的话,为什么要给你一个ViewGroup参数呢?事实证明父视图在这个inflation操作过程中是很重要的,它会计算被载入的XML在根元素中的LayoutParams,如果传入null话,就等于是告诉框架“我不知道载入的View要放到哪个父视图中”。
3.问题在于,android:layout_xxx属性会在父视图对象中被重新计算,结果就是所有你定义的LayoutParams都会被忽略掉(因为没有已知的父视图对象)。然后你就纳闷“为什么框架会忽略掉我自己定义的布局属性呢?还是去StackOverFlow上看看,提一个bug吧”。
如果没有设置LayoutParams,那么最终ViewGroup也会给你生成一个默认的属性,幸运的话(很多时候),这些默认的设置正好和你在XML文件中定义的一样……所以你就察觉不到其实已经出现问题了。
多人在网上问LayoutInflater类的用法,以及inflate()方法参数的含义,现解释如下:
inflate()的作用就是将一个用xml定义的布局文件查找出来,注意与findViewById()的区别,inflate是加载一个布局文件,而findViewById则是从布局文件中查找一个控件。
LayoutInflater inflater=getLayoutInflater();
LayoutInflater inflater=(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
root:需要附加到resource资源文件的根控件,什么意思呢,就是inflate()会返回一个View对象,如果第三个参数attachToRoot为true,就将这个root作为根对象返回,否则仅仅将这个root对象的LayoutParams属性附加到resource对象的根布局对象上,也就是布局文件resource的最外层的View上,比如是一个LinearLayout或者其它的Layout对象。
attachToRoot:是否将root附加到布局文件的根视图上
[各个参数的意义][]http://www.2cto.com/kf/201407/313054.html]
获取LayoutInflater对象有三种方法
关于LayoutInflater类inflateint resource ViewGroup root boolean attachToRoot方法三个参数的含义
参考
Layout inflation在Android上下文环境下转换XML文件成View结构对象的时候需要用到。
框架中的示例
Adapter是最常用的场景,我们经常需要使用LayoutInflater来自定义ListView(通过重写getView()方法),具体的方法签名是这样的:getView(int position, View convertView, ViewGroup parent);
Fragment也会用到inflation操作,通过onCreateView()方法创建view的时候会用到。这个方法的签名是这样的:
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
1. 不知你有没有注意到这一点,每次Framework需要你去载入一个布局文件时,都会传入一个ViewGroup参数(最后需要绑定到的根视图),如果Layoutinflater设为自动绑定到根视图的话,会抛出一个异常。
2. 所以你想想看,如果我做绑定操作的话,为什么要给你一个ViewGroup参数呢?事实证明父视图在这个inflation操作过程中是很重要的,它会计算被载入的XML在根元素中的LayoutParams,如果传入null话,就等于是告诉框架“我不知道载入的View要放到哪个父视图中”。
3.问题在于,android:layout_xxx属性会在父视图对象中被重新计算,结果就是所有你定义的LayoutParams都会被忽略掉(因为没有已知的父视图对象)。然后你就纳闷“为什么框架会忽略掉我自己定义的布局属性呢?还是去StackOverFlow上看看,提一个bug吧”。
如果没有设置LayoutParams,那么最终ViewGroup也会给你生成一个默认的属性,幸运的话(很多时候),这些默认的设置正好和你在XML文件中定义的一样……所以你就察觉不到其实已经出现问题了。
多人在网上问LayoutInflater类的用法,以及inflate()方法参数的含义,现解释如下:
inflate()的作用就是将一个用xml定义的布局文件查找出来,注意与findViewById()的区别,inflate是加载一个布局文件,而findViewById则是从布局文件中查找一个控件。
1.获取LayoutInflater对象有三种方法
LayoutInflater inflater=LayoutInflater.from(this);LayoutInflater inflater=getLayoutInflater();
LayoutInflater inflater=(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
2.关于LayoutInflater类inflate(int resource, ViewGroup root, boolean attachToRoot)方法三个参数的含义
resource:需要加载布局文件的id,意思是需要将这个布局文件中加载到Activity中来操作。root:需要附加到resource资源文件的根控件,什么意思呢,就是inflate()会返回一个View对象,如果第三个参数attachToRoot为true,就将这个root作为根对象返回,否则仅仅将这个root对象的LayoutParams属性附加到resource对象的根布局对象上,也就是布局文件resource的最外层的View上,比如是一个LinearLayout或者其它的Layout对象。
attachToRoot:是否将root附加到布局文件的根视图上
参考
[什么时候传入null][]http://blog.jobbole.com/72156/][各个参数的意义][]http://www.2cto.com/kf/201407/313054.html]
相关文章推荐
- SVN-项目 XXX 受源代码管理。向源代码管理注册此项目时出错。建议不要对此项目进行任何修改
- android动画开发
- hdu 1010 Tempter of the Bone(dfs)
- swift - 函数指针的应用 - 避免重复算法
- 最大子段和
- javascript实现五星评价代码(源码下载)
- 基础总结篇之三:Intent应用详解
- 使用 Rest-assured 测试 Restful Web Services
- Air Raid---hdu1151(最小路径覆盖)
- gcc 编译报错
- Android屏幕适配全攻略(最权威的官方适配指导)
- HDOJ 1513 Palindrome(LCS+滚动数组)
- linuxx virutal machine installation
- Spring学习笔记三(AOP中的那些事)
- ORACLE FORMS Builder 设置栏位背景颜色
- 源码推荐(8.11):Pinterest开源图片下载和缓存框架,查看单元格渲染时间
- PHP基础----06逻辑运算
- HDU 3308 LCIS (线段树·单点更新·区间合并)
- Linux下使用texmaker编译IEEE trans 模板经验分享
- 在Xcode的Playground中使用时间轴功能