錯誤代碼
// MyPaint.java
private View paint_layout; // 字段未初始化,為 null
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(paint_layout); // 傳入 null -> 崩潰
}
修正方案
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.paint_layout); // 直接使用資源 ID
// 或
// View view = LayoutInflater.from(this).inflate(R.layout.paint_layout, null);
// setContentView(view);
}
原因分析
- `paint_layout` 字段僅聲明未賦值,默認 `null`。
- `setContentView(View)` 接受已 inflate 好的 View 對象,傳入 `null` 導致 `NullPointerException` 或窗口管理器崩潰。
- 在 `MainActivity` 中用 `LayoutInflater` 預先 inflate 並持有引用屬於「過度設計」,Activity 之間應通過 `Intent` 傳遞數據,各自在 `onCreate` 中 `setContentView(R.layout.xxx)`。
最佳實踐
- 每個 Activity 對應一個佈局 XML(`R.layout.xxx`)。
- `Intent` 傳遞必要數據(ID、參數),目標 Activity 根據數據查詢/渲染。
- 共用 UI 組件提取為 `` 或自定義 View/Fragment 復用。