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

Android Fragment 加載失敗:Not attached to Activity 生命週期陷阱

     編輯:程式設計綜合問答

崩潰日誌

Caused by: java.lang.IllegalStateException: Fragment ReadingTitleFragment{414f5f38} not attached to Activity
    at android.app.Fragment.getResources(Fragment.java:762)
    at com.example.ReadingTitleFragment.(ReadingTitleFragment.java:27)

根本原因

在 `Fragment` 構造函數或字段初始化處調用 `getActivity()`、`getResources()` 等依賴 `Activity` 上下文的方法。此時 Fragment 尚未附加到 Activity,`mActivity` 為 null,拋出 `IllegalStateException`。

錯誤代碼模式


public class ReadingTitleFragment extends Fragment {
    // 錯誤:字段初始化階段調用 getResources()
    private String title = getResources().getString(R.string.title); 
    // 或構造函數
    public ReadingTitleFragment() {
        getActivity().runOnUiThread(...); // 崩潰
    }
}

正確生命週期鉤子

階段回調方法可安全使用 getActivity()
構造/字段初始化構造函數、字段賦值❌ 禁止
附加到 ActivityonAttach(Context)✅ 可獲取 context
創建視圖onCreateView(LayoutInflater, ViewGroup, Bundle)✅ 可獲取 getActivity()
Activity 創建完成onActivityCreated(Bundle)✅ 推薦初始化數據

修正代碼


public class ReadingTitleFragment extends Fragment {
    private String title;
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        // 此處安全獲取資源
        title = context.getString(R.string.title);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_reading, container, false);
        // 使用 title 更新 UI
        return view;
    }
}

最佳實踐

  • Fragment 構造函數保持為空,不做任何初始化。
  • 所有依賴 Context/Activity 的操作放入 `onAttach` 或 `onCreateView` 之後。
  • 使用 `requireActivity()`/`requireContext()` (Fragment 1.1.0+) 獲取非空引用,自動拋出異常提示錯誤位置。
  • XML 靜態添加 `` 時,系統會在 Activity `onCreate` 中實例化 Fragment,生命週期同步,但仍需遵守上述規則。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved