錯誤訊息 NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.addView(android.view.View)' on a null object reference 指出 LinearLayout l 為 null。原因在於 findViewById(R.layout.linearlayout) 傳入的是 版面配置資源 ID(R.layout.xxx),而非 View 元件 ID(R.id.xxx)。
setContentView(R.layout.linearlayout);
LinearLayout l = (LinearLayout) findViewById(R.layout.linearlayout); // 錯誤
res/layout/linearlayout.xml)的根 LinearLayout 加入 android:id="@+id/lin"。findViewById(R.id.lin)。<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:id="@+id/lin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 子元件 -->
</LinearLayout>
setContentView(R.layout.linearlayout);
LinearLayout l = (LinearLayout) findViewById(R.id.lin); // 正確
DrawView dv = new DrawView(this);
dv.setMinimumHeight(300);
dv.setMinimumWidth(300);
l.addView(dv);
R.layout.xxx 對應整個 XML 檔案,R.id.xxx 對應 XML 中某個元件的 android:id。DrawView 需實作 onDraw(Canvas) 與觸控事件,範例中已正確覆寫。記住:findViewById 只能找元件 ID,不能找版面 ID,這是新手最常犯的錯誤之一。