學習《第一行代碼 Android》時,在 2.2.2 節創建並加載佈局時產生疑惑:按鈕已在 XML 佈局文件中定義,為什麼還要在 Activity 中通過 setContentView() 加載?其背後原理是什麼?
打個比方:
XML 只是靜態描述視圖層次與屬性的配置文件,本身不具備顯示能力。只有通過 Activity 的 setContentView(R.layout.xxx) 將其「充氣」為具體的 View 對象樹,並掛載到 Activity 的視窗中,用戶才能在屏幕上看到界面。
setContentView() 調用 LayoutInflater.inflate() 解析 XMLPhoneWindow 的 DecorView 中public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 關鍵步驟:將 XML 佈局轉化為可見的 View 樹
setContentView(R.layout.activity_main);
// 此後才能通過 findViewById 獲取佈局中定義的控件
Button btn = findViewById(R.id.my_button);
btn.setOnClickListener(v -> Toast.makeText(this, "點擊了", Toast.LENGTH_SHORT).show());
}
}
佈局文件定義「長什麼樣」,Activity 負責「顯示出來」。兩者分離符合 MVC 思想:XML 承擔 View 層職責,Activity 作為 Controller 協調數據與視圖。理解這一點,有助於後續學習 Fragment、ViewBinding、Jetpack Compose 等現代開發模式。