LayoutInflater的用法总结
一、获得LayoutInflater实例的3中方法
- 通过activity中的getLayoutInflater();
- 通过LayoutInflater.from(context);
- 通过(LayoutInflater)getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
二、inflate参数的含义解析
大神详细解析文章:http://blog.csdn.net/lmj623565791/article/details/38171465
inflate(int resource, ViewGroup root, boolean attachToRoot);
- ==inflate(int resource,null);==
是找到此xml布局文件,返回的就是此xml布局的view。不能正确的处理view其宽高,是因为是相对于父布局设置的宽高,但是root为null,故不能正确设置其view的宽高。 - ==inflate(int resource,root,false)==
将此xml布局添加到root中,也就是root作为其父布局,因为第三个参数attachToRoot为false,故只把其父布局root的LayoutParamas参数传递,而不将xml布局添加到root中,返回的就是一个带有父布局LayoutParamas参数的xml布局的view。 - ==inflate(int resource,root,true)==
为true时当然就是把xml布局添加到root中,并且返回root布局的view。 - ==inflate(int resource,root)==
查看源码可知:
public View inflate(int resource, ViewGroup root) {
return inflate(resource, root, root != null);
}
其实他使用的就是inflate三个参数的方法,当root=null时,和第一种方法一样,root!=null时,和第三种的true时一样。
==注意==:
- listview中,我们重写适配器的getview方法时,inflate(resourceID,root,attachToRoot),其中attachToRoot不能为true(因为系统已经帮我们加到父布局了),否则会报错。
一般使用inflater.inflate(R.layout.fragment1, null);
10-25 18:42:07.979: E/AndroidRuntime(6023): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
- fragment的oncreateView中的inflate也不能为true
一般使用inflater.inflate(R.layout.fragment1, container,false);