3

我想知道是否可以使用 xml 布局文件从代码中动态定义视图的内容。当我们启动一个活动时,我们将 xml 布局传递给它以与方法调用一起使用,setContentView(R.layout.main);但是是否可以使用 xml 布局文件来定义动态创建的 ViewGroup,例如 LinearLayout?

我有一个显示游戏得分表的布局 xml。此屏幕上显示的每个分数都需要通过代码动态添加。我知道可以在代码中为这个分数创建一个 ViewGroup 并用我需要制作一个分数的所有东西填充它,然后每次为每个分数都这样做,然后将它们全部添加到现有 UI结构,已在 xml 布局中定义。我想知道的是是否可以使用另一个 xml 文件来执行此操作?

例如,一个布局 xml 文件:

<LinearLayout android:id="@+id/top">
  <LinearLayout android:id="@+id/column_heading"/>
</LinearLayout>

在另一个 xml 布局文件中是这样的:

<LinearLayout android:id="@+id/row">
  <TextView/>
  <TextView/>
  <TextView/>
  <TextView/>
</LinearLayout>

在代码中,我想做如下的事情:

LinearLayout top = (LinearLayout)findViewById(R.id.top);
for (int i = 0; i < num_of_rows; i++) {
  LinearLayout row = new LinearLayout(this);
  row.setContentView(R.layout.row);  //where R.layout.row is the second layout above
  // ... dynamically change values as needed
  top.addView(row);
}

但是.setContentView(...),它不是 LinearLayout 的有效方法。还有另一种方法可以做到这一点吗?我知道我可以通过代码来完成这一切,但这相当混乱,而且这种方式似乎非常整洁和合理..

4

3 回答 3

2

你应该使用LayoutInflater这个。这是一个简短的例子

LinearLayout top = (LinearLayout)findViewById(R.id.top);
for (int i = 0; i < num_of_rows; i++) {
    LayoutInflater inflater = LayoutInflater.from(this);
    LinearLayout row = (LinearLayout)inflater.inflate(R.layout.row, null);    
    // ... dynamically change values as needed
    top.addView(row);
}
于 2011-06-20T14:30:00.237 回答
1
LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.row, null);
于 2011-06-20T14:29:32.700 回答
1

您可以使用LayoutInflater'inflate方法从资源中扩充任意布局。如果您为此方法提供根视图参数,则膨胀的布局将包含在其中。通过这种方式,您可以将 XML 视图膨胀到您的行中。

于 2011-06-20T14:30:05.413 回答