LinearLayout parentLayout = findViewById(R.id.parentLayout);
LinearLayout[] lLayout = new LinearLayout[8];
for (int i = 0; i < lLayout.length; i++) {
lLayout[i] = new LinearLayout(this);
lLayout[i].setId(i);
lLayout[i].setOrientation(LinearLayout.HORIZONTAL);
lLayout[i].setBackgroundColor(i % 2 == 0 ? Color.GREEN : Color.MAGENTA);
parentLayout.addView(lLayout[i]); // 缺少 LayoutParams,寬高默認 0,不可見
}
代碼創建的 LinearLayout 未設置 LayoutParams,父容器 LinearLayout(垂直)測量子視圖時,寬高均為 0,導致佈局面積為 0,肉眼不可見。
for (int i = 0; i < lLayout.length; i++) {
lLayout[i] = new LinearLayout(this);
lLayout[i].setId(View.generateViewId()); // API 17+ 推薦生成唯一 ID
lLayout[i].setOrientation(LinearLayout.HORIZONTAL);
lLayout[i].setBackgroundColor(i % 2 == 0 ? Color.GREEN : Color.MAGENTA);
// 關鍵:設置寬高
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, // 寬度撐滿父容器
200); // 固定高度 200px,或 WRAP_CONTENT
lLayout[i].setLayoutParams(params);
parentLayout.addView(lLayout[i]);
}
| 父容器類型 | 子視圖應用 LayoutParams 類 |
|---|---|
| LinearLayout | LinearLayout.LayoutParams |
| RelativeLayout | RelativeLayout.LayoutParams |
| FrameLayout | FrameLayout.LayoutParams |
| ConstraintLayout | ConstraintLayout.LayoutParams |
| ViewGroup (通用) | ViewGroup.LayoutParams |
for (int i = 0; i < 8; i++) {
LinearLayout row = new LinearLayout(this);
row.setOrientation(LinearLayout.HORIZONTAL);
row.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
// 向 row 添加 TextView 等
for (int j = 0; j < 3; j++) {
TextView tv = new TextView(this);
tv.setText("Item " + i + "-" + j);
tv.setLayoutParams(new LinearLayout.LayoutParams(
0, ViewGroup.LayoutParams.WRAP_CONTENT, 1f)); // 權重均分
row.addView(tv);
}
parentLayout.addView(row);
}
**動態創建任何 View 必須顯式設置 LayoutParams**,否則寬高為 0 不可見。父容器類型決定 LayoutParams 具體類,務必匹配。善用 MATCH_PARENT、WRAP_CONTENT、權重實現彈性佈局。