如何将相对布局动态插入 table 布局
How to dynamically insert a relative layout into a table layout
我是 Android 编程的新手。我想要一个具有 3 行和 3 列的 table 布局(可能我会动态更改这些数字),每个 table 行内部都有一个相对布局。这类似于 Google Play Store 中显示的视图,它显示了 Play 等的新品。我尝试使用按钮来实现这一点。但我想扩充一个 xml 文件,将相对布局作为带有 ImageView 和 TextView 的根。这可能吗?或者实现这种布局的最佳方式是什么?此外,如何找到膨胀布局的图像视图和文本视图,以便我可以通过编程方式向其添加属性。这是我试过的。
private void populateCategoryGrid() {
TableLayout categoriesLayout;
TableRow row;
Button btn_category; int category_count = 12;
int NUM_ROW = category_count/3;
int NUM_COL = category_count/4;
for (int r=0;r<NUM_ROW;r++) {
row = new TableRow(this);
row.setLayoutParams(new TableLayout.LayoutParams(
TableLayout.LayoutParams.MATCH_PARENT,
TableLayout.LayoutParams.MATCH_PARENT,
1.0f
));
categoriesLayout.addView(row);
for (int c = 0; c <NUM_COL; c++) {
btn_category = new Button(this);
btn_category.setId(c);
btn_category.setPadding(0, 0, 0, 0);
btn_category.setLayoutParams(new TableRow.LayoutParams(
TableRow.LayoutParams.MATCH_PARENT,
TableRow.LayoutParams.MATCH_PARENT,
1.0f
));
row.addView(btn_category);
}
}
}
通过将按钮循环并膨胀成行,您几乎完成了所有工作。稍作调整即可大功告成:
private void populateCategoryGrid() {
TableLayout categoriesLayout;
int category_count = 12;
int NUM_ROW = category_count/3;
int NUM_COL = category_count/4;
LayoutInflater inflater = LayoutInflater.from(this);
// Add rows
for (int r=0;r<NUM_ROW;r++) {
TableRow row = new TableRow(this);
row.setLayoutParams(new TableLayout.LayoutParams(
TableLayout.LayoutParams.MATCH_PARENT,
TableLayout.LayoutParams.MATCH_PARENT,
1.0f
));
// Add inflated layouts
for (int c = 0; c <NUM_COL; c++) {
// Inflate layout
RelativeLayout rl = (RelativeLayout) inflater.inflate(R.layout.rel_layout, null);
// Modify inflated layout
ImageView img = (ImageView) rl.findViewById(R.id.img);
img.setBackgroundColor(Color.RED);
TextView tv = (TextView) rl.findViewById(R.id.text);
tv.setText("Some text");
// Add the modified layout to the row
row.addView(rl);
}
// Add row to the table
categoriesLayout.addView(row);
}
}
一些注意事项:
- 您可以为每个
TableRow
使用局部变量,因为一旦行完成,您就不会更改其中的任何内容
LayoutInflater.inflate
returns 根视图,您可以在其中 findViewById
位于其中的任何视图
我是 Android 编程的新手。我想要一个具有 3 行和 3 列的 table 布局(可能我会动态更改这些数字),每个 table 行内部都有一个相对布局。这类似于 Google Play Store 中显示的视图,它显示了 Play 等的新品。我尝试使用按钮来实现这一点。但我想扩充一个 xml 文件,将相对布局作为带有 ImageView 和 TextView 的根。这可能吗?或者实现这种布局的最佳方式是什么?此外,如何找到膨胀布局的图像视图和文本视图,以便我可以通过编程方式向其添加属性。这是我试过的。
private void populateCategoryGrid() {
TableLayout categoriesLayout;
TableRow row;
Button btn_category; int category_count = 12;
int NUM_ROW = category_count/3;
int NUM_COL = category_count/4;
for (int r=0;r<NUM_ROW;r++) {
row = new TableRow(this);
row.setLayoutParams(new TableLayout.LayoutParams(
TableLayout.LayoutParams.MATCH_PARENT,
TableLayout.LayoutParams.MATCH_PARENT,
1.0f
));
categoriesLayout.addView(row);
for (int c = 0; c <NUM_COL; c++) {
btn_category = new Button(this);
btn_category.setId(c);
btn_category.setPadding(0, 0, 0, 0);
btn_category.setLayoutParams(new TableRow.LayoutParams(
TableRow.LayoutParams.MATCH_PARENT,
TableRow.LayoutParams.MATCH_PARENT,
1.0f
));
row.addView(btn_category);
}
}
}
通过将按钮循环并膨胀成行,您几乎完成了所有工作。稍作调整即可大功告成:
private void populateCategoryGrid() {
TableLayout categoriesLayout;
int category_count = 12;
int NUM_ROW = category_count/3;
int NUM_COL = category_count/4;
LayoutInflater inflater = LayoutInflater.from(this);
// Add rows
for (int r=0;r<NUM_ROW;r++) {
TableRow row = new TableRow(this);
row.setLayoutParams(new TableLayout.LayoutParams(
TableLayout.LayoutParams.MATCH_PARENT,
TableLayout.LayoutParams.MATCH_PARENT,
1.0f
));
// Add inflated layouts
for (int c = 0; c <NUM_COL; c++) {
// Inflate layout
RelativeLayout rl = (RelativeLayout) inflater.inflate(R.layout.rel_layout, null);
// Modify inflated layout
ImageView img = (ImageView) rl.findViewById(R.id.img);
img.setBackgroundColor(Color.RED);
TextView tv = (TextView) rl.findViewById(R.id.text);
tv.setText("Some text");
// Add the modified layout to the row
row.addView(rl);
}
// Add row to the table
categoriesLayout.addView(row);
}
}
一些注意事项:
- 您可以为每个
TableRow
使用局部变量,因为一旦行完成,您就不会更改其中的任何内容 LayoutInflater.inflate
returns 根视图,您可以在其中findViewById
位于其中的任何视图