LayoutInflater.inflate 和 findViewById 的区别

The difference between LayoutInflater.inflate and findViewById

像这样获取对小部件的引用有什么区别:

TableRow row = findViewById(R.id.table_row);

和:

TableRow row = (TableRow)LayoutInflater.from(this).inflate(R.layout.table_row, null);

TableRow 是其布局的根或者它只是布局的一小部分时,是否也有区别?

What is the difference...

第一个是检索 activity 中的现有小部件。

第二个正在读取 XML 文件并正在创建 new 小部件。第二个也有点问题,因为你很少想使用 LayoutInflater.from()(你通常在 Activity 上使用 getLayoutInflater()),而且你很少想使用 inflate()变体(如果您不提供父容器,具有根 RelativeLayout 元素的布局资源将出现异常)。

Is there also a difference when the TableRow is a root of its layout or if its just a small part of a layout?

是的。不同之处与以前相同:检索现有小部件或创建新小部件。

1) 使用

TableRow row = findViewById(R.id.table_row);

只是获取对已创建的 ID 为 R.id.table_rowView 的引用并在当前布局中膨胀(其中 current 表示 Activtiy 的布局或您正在定义的 View

2) 使用

TableRow row = (TableRow)LayoutInflater.from(this).inflate(R.layout.table_row, null);

您正在 膨胀(这意味着创建)基于 R.layout.table_row[= 中包含的 XML 定义的新视图层次结构33=]。由于您没有在 inflate() 方法中传递父视图参数,因此您需要将生成的层次结构手动添加到现有容器中。