我曾经也遇到了使用LayoutInflater的困难,其他人也是如此:如何在运行时使用LayoutInflator添加视图?。
为什么LayoutInflater会忽略我指定的布局参数?例如,为什么我的资源XML中的layout_width和layout_height值没有被遵守?
为什么LayoutInflater会忽略我指定的布局参数?例如,为什么我的资源XML中的layout_width和layout_height值没有被遵守?
LayoutInflater
动态填充布局。LayoutInflater.inflate()
参数的样式:
R.layout.main_page
)。attachToRoot
为true
),或者仅是提供一组LayoutParams
值以用于返回的层次结构的根视图的对象(如果attachToRoot
为false
)。attachToRoot: 是否应将充气层次结构附加到根参数? 如果为false,则仅使用root来创建XML中根视图的正确子类LayoutParams
。
返回值: 充气层次结构的根View。如果提供了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>
如果从XML中成功应用布局参数 (red.xml
),则此容器中添加了一个单独的TextView,以小红色方块的形式可见:
<?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
时未指定根视图,那么inflate调用将忽略XML中的布局参数。如果使用不为null
并且attachRoot=true
的根视图调用inflate,则会加载布局参数,但返回的是根对象,这会阻止进一步的布局更改(除非您可以使用findViewById()
找到它)。
因此,您最可能要使用的调用约定是:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
为了帮助解决布局问题,强烈推荐使用Layout Inspector。
Activity
是 Context
的子类,答案中的示例都在 Activity
的范围内,因此为了简化操作,我用 this
替换了 getBaseContext()
,因为在这个答案中,它们是等效的。 - Marcin Orlowskihttps://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
想要在上面的主要答案中添加
我尝试跟着做,但我的recyclerView开始将每个项目拉伸到屏幕上
我不得不在充气后添加下一行以达到目标
itemLayoutView.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
我已经通过xml添加了这些参数,但它没有正常工作
而加上这一行就没问题了