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

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

[html]view plaincopy

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布局:

[html]view plaincopy

android:layout_width="fill_parent"

android:layout_height="50dp"

android:layout_margin="50dp"

android:gravity="center"

android:orientation="horizontal">

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="TextView1"/>

android:id="@+id/textView2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="TextView2"/>

LinearLayout>

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

LayoutInflater.from(context).inflate()的使用的问题_第1张图片

[html]view plaincopy

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 (ifattachToRootis true), or else simply an object that provides a set of LayoutParams values for root of the returned hierarchy (ifattachToRootis false.)

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

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

然后咱们看源代码里

[html]view plaincopy

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

这个其实 是这样调用的:

[java]view plaincopy

publicViewinflate(intresource,ViewGrouproot){

returninflate(resource,root,root!=null);

}

所以我建议将其写为

[java]view plaincopy

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

root就是加载这个view的父布局。

然后再在listview的adapter试一下,

[java]view plaincopy

@Override

publicViewgetView(intposition,ViewconvertView,ViewGroupparent){

if(convertView==null){

convertView=LayoutInflater.from(context).inflate(

R.layout.list_item,parent,false);

}

returnconvertView;

}

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

LayoutInflater.from(context).inflate()的使用的问题_第2张图片

[html]view plaincopy

android:layout_height="50dp"

这句已经起到作用,但layout_margin无效果。

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

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

[java]view plaincopy

layout=(LinearLayout)findViewById(R.id.layout1);

Viewview=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不能加子控件,会报如下错误:

[html]view plaincopy

java.lang.UnsupportedOperationException:addView(View,LayoutParams)isnotsupportedinAdapterView

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

[java]view plaincopy

Viewview=LayoutInflater.from(this).inflate(R.layout.list_item,layout,false);

layout.addView(view);

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

转自:http://blog.sina.com.cn/s/blog_7d95a2e70102v9xr.html,thanks

你可能感兴趣的:(LayoutInflater.from(context).inflate()的使用的问题)