我在使LayoutInflater正常工作时遇到了很大的麻烦,其他人也是如此:如何在运行时使用layoutinflator添加视图?。
为什么LayoutInflater会忽略我指定的布局参数?例如,为什么不尊重我的资源XML 中的layout_width
和layout_height
值?
我在使LayoutInflater正常工作时遇到了很大的麻烦,其他人也是如此:如何在运行时使用layoutinflator添加视图?。
为什么LayoutInflater会忽略我指定的布局参数?例如,为什么不尊重我的资源XML 中的layout_width
和layout_height
值?
Answers:
我已经研究了这个问题,参考了LayoutInflater文档并建立了一个小样本演示项目。以下教程显示了如何使用来动态填充布局LayoutInflater
。
在开始之前,请先查看LayoutInflater.inflate()
参数如下:
R.layout.main_page
)attachToRoot
为true
)的父级,或者只是一个LayoutParams
为返回的层次结构的根(如果attachToRoot
为false
)提供一组值的对象。attachToRoot:是否应将扩展的层次结构附加到root参数?如果为false,则root仅用于为LayoutParams
XML中的根视图创建的正确子类。
返回:展开的层次结构的根视图。如果提供了root且attachToRoot
为true
,则为root。否则,它是膨胀的XML文件的根。
现在获取示例布局和代码。
主要布局(main.xml
):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
添加到此容器中的是一个单独的TextView,如果从XML(red.xml
)成功应用了布局参数,则将显示为红色小方块:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="#ff0000"
android:text="red" />
现在LayoutInflater
可用于多种调用参数
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view, 100, 100);
// result: layout_height=25dp layout_width=25dp
// view=textView due to attachRoot=false
view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
参数变化的实际结果记录在代码中。
提要:LayoutInflater
不指定root的调用会导致忽略XML中的布局参数而导致膨胀的调用。以root不等于调用inflate null
并attachRoot=true
会加载布局参数,但会再次返回根对象,这会阻止对加载的对象进行进一步的布局更改(除非您可以使用来找到它findViewById()
)。因此,您最可能想使用的调用约定是:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
为了帮助解决布局问题,强烈建议使用“ 布局检查器”。
Activity
是的子类,Context
并且答案的示例在的范围内Activity
,因此为了简化起见,我getBaseContext()
用this
as 代替了它,就这个答案而言,它是等效的。
andig是正确的,因为LayoutInflater忽略您的layout_params的常见原因是未指定根。许多人认为您可以将null传递给root。对于某些情况(例如对话框),这是可以接受的,在这种情况下,创建时您无权访问root。但是,要遵循的一个好规则是,如果您具有root用户,则将其分配给LayoutInflater。
我写了一篇关于此的深入博客文章,您可以在这里查看:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
This is acceptable for a few scenarios such as a dialog
那就是我所需要的