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() |
|---|---|---|
| 構造/字段初始化 | 構造函數、字段賦值 | ❌ 禁止 |
| 附加到 Activity | onAttach(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;
}
}