为什么使用 LayoutInflater 与 xml 不同?

Why using LayoutInflater is not same to xml?

我创建了这个布局

<LinearLayout
    android:id="@+id/list"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="10dp"
    android:layout_marginBottom="20dp"
    android:layout_weight=".7" >
    <RelativeLayout
        android:layout_width="70dp"
        android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/icon"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginTop="10dip"
            android:layout_marginRight="10dip"
            android:layout_marginLeft="10dip"
            android:src="@mipmap/icon" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:src="@mipmap/delete_button" />
        <TextView
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            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_width="0dp"
    android:layout_height="wrap_content"
    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_width="70dp"
    android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginTop="10dip"
        android:layout_marginRight="10dip"
        android:layout_marginLeft="10dip"
        android:src="@mipmap/icon" />
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:src="@mipmap/delete_button" />
    <TextView
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        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);

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

试试这个:

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

解释:

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

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

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