为啥使用 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 会忽略我指定的 layout_width 和 layout_height 布局参数?
为啥 LayoutInflater 会忽略我指定的 layout_width 和 layout_height 布局参数?