首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android TabActivity 空指針 Crash:setContentView 必須先於 findViewById 執行

     編輯:程式設計綜合問答

崩潰代碼片段

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    et1 = (EditText) findViewById(R.id.editText1);  // 1. 先 findViewById
    et2 = (EditText) findViewById(R.id.editText2);
    bt = (Button) findViewById(R.id.button1);
    setContentView(R.layout.activity_main);         // 2. 再 setContentView → 所有 findViewById 返回 null
    // ...
}

根因

setContentView() 完成佈局填充,構建 View 層級結構。在此之前調用 findViewById(),Activity 的 mContentView 為 null,故返回 null。後續對 et1、bt 等操作(如 setOnClickListener)觸發 NullPointerException。

修正順序

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);         // 1. 先填充佈局
    et1 = (EditText) findViewById(R.id.editText1);  // 2. 再查找 View
    et2 = (EditText) findViewById(R.id.editText2);
    bt = (Button) findViewById(R.id.button1);
    // 後續邏輯...
}

擴展:TabActivity 已棄用,遷移建議

  • TabActivity 自 API 13 (Android 3.2) 起棄用,現代應用使用 ViewPager + Fragment + TabLayout 實現分頁。
  • 遷移步驟:
    1. 佈局使用 TabLayout + ViewPager2。
    2. 編寫 FragmentStateAdapter 管理分頁 Fragment。
    3. TabLayoutMediator 綁定 TabLayout 與 ViewPager2。
    4. 原 Tab 內容分別封裝為 Fragment。
  • 優勢:生命週期管理規範、支持巢狀 Fragment、動畫流暢、Material Design 風格。

常見新手錯誤清單

錯誤後果修正
findViewById 在 setContentView 前NPE調整順序
使用棄用 TabActivity兼容性風險、功能受限遷移 ViewPager2+Fragment
ListView/Spinner 適配器未設置空列表setAdapter()
AlertDialog 按鈕邏輯錯誤點擊無反應使用 setButton(DialogInterface.OnClickListener)

養成「先 setContentView,後 findViewById」肌肉記憶,並拥抱現代 Android 架構組件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved