为什么使用 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
。
我创建了这个布局
<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
。