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


在一般项目中使用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布局:

<</span>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" >  
  
    <</span>TextView  
        android:id="@+id/textView1"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="TextView1" />  
  
    <</span>TextView  
        android:id="@+id/textView2"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="TextView2" />  
  
</</span>LinearLayout>  

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

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

html] view plaincopy

  1. android:layout_height=“50dp”  
  2.   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里。

然后咱们看源代码里

[html] 
view plain
copy

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

 这个其实 是这样调用的: 

[java] 
view plain
copy

  1. public View inflate(int resource, ViewGroup root) {  
  2.     return inflate(resource, root, root != null);  
  3. }  

所以我建议将其写为
[java] 
view plain
copy

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

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

然后再在listview的adapter试一下,

[java] 
view plain
copy

  1. @Override  
  2. public View getView(int position, View convertView, ViewGroup parent) {  
  3.     if (convertView == null) {  
  4.         convertView = LayoutInflater.from(context).inflate(  
  5.                 R.layout.list_item, parent, false);  
  6.     }     
  7.   
  8.     return convertView;  
  9. }  

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

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

[html] 
view plain
copy

  1. android:layout_height=“50dp”  

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

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

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

[java] 
view plain
copy

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

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

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

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

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

[html] 
view plain
copy

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

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

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

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

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


    原文作者:道路修建问题
    原文地址: https://blog.csdn.net/asde1239/article/details/53534930
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞