为啥使用 LayoutInflater 与 xml 不同?

Posted

技术标签:

【中文标题】为啥使用 LayoutInflater 与 xml 不同?【英文标题】:Why using LayoutInflater is not same to xml?为什么使用 LayoutInflater 与 xml 不同? 【发布时间】:2015-07-02 05:18:52 【问题描述】:

我创建了这个布局

<LinearLayout
    android:id="@+id/list"
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:layout_marginTop="10dp"
    android:layout_marginBottom="20dp"
    android:layout_weight=".7" >
    <RelativeLayout
        android:layout_
        android:layout_>
        <ImageView
            android:id="@+id/icon"
            android:layout_
            android:layout_
            android:layout_marginTop="10dip"
            android:layout_marginRight="10dip"
            android:layout_marginLeft="10dip"
            android:src="@mipmap/icon" />
        <ImageView
            android:layout_
            android:layout_
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:src="@mipmap/delete_button" />
        <TextView
            android:layout_
            android:layout_
            android:gravity="center_horizontal"
            android:textColor="@android:color/white"
            android:singleLine="true"
            android:textSize="10sp"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="5dp"
            android:layout_below="@id/icon"
            android:text="name"/>
    </RelativeLayout>
</LinearLayout>

输出是

当我确定显示正确时,我将项目分离到另一个 xml 文件中

mainactivity.xml

<LinearLayout
    android:id="@+id/list"
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:layout_marginTop="10dp"
    android:layout_marginBottom="20dp"
    android:layout_weight=".7" >
</LinearLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>
    <ImageView
        android:id="@+id/icon"
        android:layout_
        android:layout_
        android:layout_marginTop="10dip"
        android:layout_marginRight="10dip"
        android:layout_marginLeft="10dip"
        android:src="@mipmap/icon" />
    <ImageView
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:src="@mipmap/delete_button" />
    <TextView
        android:layout_
        android:layout_
        android:gravity="center_horizontal"
        android:textColor="@android:color/white"
        android:singleLine="true"
        android:textSize="10sp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="5dp"
        android:layout_below="@id/icon"
        android:text="name"/>
</RelativeLayout>

然后在mainactivity的onCreate中添加item

LayoutInflater inflater=LayoutInflater.from(this);
View view=inflater.inflate(R.layout.item, null, true);
list.addView(view); //(R.id.list), LinearLayout list

现在输出是

即使我在这个线性布局中添加了许多视图,仍然只能将一个视图添加到布局中

LayoutInflater inflater=LayoutInflater.from(this);
View view=inflater.inflate(R.layout.item, null, true);
View view2=inflater.inflate(R.layout.other_item, null, true);
list.addView(view); //(R.id.list), LinearLayout list
list.addView(view2);

向布局添加视图的正确方法是什么?

【问题讨论】:

我不确定,但请查看此链接,您可能会得到帮助clcik here 只需使用:inflater.inflate(R.layout.item, list) 【参考方案1】:

试试这个:

View view = inflater.inflate(R.layout.item, list, false);
list.addView(view); //(R.id.list), LinearLayout list

解释:

inflate() 的第二个参数是要膨胀的视图的预期父级。当您将null 作为第二个参数传递时,膨胀视图不会得到任何LayoutParams,因为inflate() 不知道父级最终会是什么,因此无法创建适当的LayoutParams(几乎每个ViewGroup定义了自己的LayoutParams 子类)。

当您调用 addView() 时,LinearLayout 会检查孩子是否有 LayoutParams 以及它们是否属于适当的类型。如果没有,它会生成一些默认的LayoutParams 来设置要添加的视图。无论它给孩子什么默认值都会导致意外行为。

简而言之,解决方案是在调用inflate() 时传递list 而不是null

【讨论】:

以上是关于为啥使用 LayoutInflater 与 xml 不同?的主要内容,如果未能解决你的问题,请参考以下文章

LayoutInflater 用于使用 xml 和 View 类

LayoutInflater

android LayoutInflater使用

为啥 LayoutInflater 会忽略我指定的 layout_width 和 layout_height 布局参数?

为啥 LayoutInflater 会忽略我指定的 layout_width 和 layout_height 布局参数?

转载《Android LayoutInflater详解》