自定義 MyGridView extends GridView 在 XML 布局中使用,主界面按鈕點擊需調用控件內部方法,new MyGridView().method() 導致崩潰。
XML 膨脹與手動 new 產生不同實例:
XML 中聲明的控件由 LayoutInflater 實例化並掛載到視圖樹,new MyGridView() 創建的是脫離視圖樹的孤立對象,無上下文、無屬性、未經 onFinishInflate 初始化。
// 1. XML 中聲明
<com.example.MyGridView
android:id="@+id/my_grid"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
// 2. Activity/Fragment 中獲取實例
MyGridView myGridView = findViewById(R.id.my_grid); // 獲取 XML 實例化的對象
// 3. 按鈕點擊調用
button.setOnClickListener(v -> myGridView.customMethod());
// 僅在代碼動態添加時使用 new
MyGridView dynamicGrid = new MyGridView(this); // 必須傳 Context
parentLayout.addView(dynamicGrid);
// 後續調用用 dynamicGrid 實例
dynamicGrid.customMethod();
NullPointerException:findViewById 返回 null → ID 拼寫錯誤 / 未 setContentView / 片段視圖未創建完成ClassCastException:XML 標籤類名與 Java 類不匹配(包含完整包名)init(context, attrs) 解析 AttributeSetAndroid 視圖系統核心原則:XML 聲明 → 系統實例化 → findViewById 獲取 → 業務調用。絕不在業務代碼中 new 已在 XML 聲明的控件。