動態建立 TextView[] 加入 LinearLayout,迴圈中直接對陣列元素呼叫 setText() 導致 NullPointerException(陣列未實例化元素)與索引錯誤(從 1 開始)。
TextView[] pairs = new TextView[num_match + 1];
for (int l = 1; l <= num_match; l++) {
pairs[l].setTextSize(15); // NPE:pairs[l] 為 null
pairs[l].setText(m1[l] + " - " + m2[l]);
myLayout.addView(pairs[l]);
}
TextView[] pairs = new TextView[num_match]; // 長度 num_match,索引 0~num_match-1
for (int l = 0; l < num_match; l++) {
pairs[l] = new TextView(this); // 必須 new 實例
pairs[l].setTextSize(15);
pairs[l].setLayoutParams(lp);
pairs[l].setId(l);
pairs[l].setText(m1[l] + " - " + m2[l]); // 資料陣列同步 0-based
myLayout.addView(pairs[l]);
}
TextView[] 只配置參考陣列,每個元素必須 new TextView(context)。l < num_match。m1/m2 同樣 0-based,或迴圈內用 l 直接索引。lp 可共用,但每個 View 仍需 setLayoutParams。public class DynamicTextViewActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dynamic);
LinearLayout container = findViewById(R.id.container);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
String[] items = {"Apple", "Banana", "Cherry", "Date"};
TextView[] views = new TextView[items.length];
for (int i = 0; i < items.length; i++) {
views[i] = new TextView(this);
views[i].setText(items[i]);
views[i].setTextSize(18);
views[i].setLayoutParams(lp);
views[i].setPadding(16, 16, 16, 16);
container.addView(views[i]);
}
}
}
動態列表建議使用 RecyclerView + Adapter,優勢:
掌握「陣列配置 ≠ 物件建立」與「0-based 索引」兩大鐵律,動態建立 View 才不會踩坑。