在 Fragment 切換時拋出 java.lang.NullPointerException,堆疊指向 onAttach() 中的接口轉型失敗。這是因為宿主 Activity 未實現 Fragment 要求的回調接口。本文教你快速修復並說明最佳實踐。
java.lang.NullPointerException
at com.example.musicplayer.MainFragment.onAttach(MainFragment.java:XX)
// 嘗試將 context 轉型為 OnMainFragmentInteractionListener 失敗
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnMainFragmentInteractionListener) {
mListener = (OnMainFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
public class MainActivity extends AppCompatActivity
implements OnMainFragmentInteractionListener {
@Override
public void onFragmentInteraction(Uri uri) {
// 處理 Fragment 回調
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
// 註釋或刪除接口檢查代碼
// if (context instanceof OnMainFragmentInteractionListener) { ... }
}
import static com.example.ycxh.atry.R.id.myMusicButton; 這類靜態導入 ID,直接用 R.id.myMusicButton 更清晰。onCreateView 中用 rootView.findViewById(R.id.myMusicButton) 獲取視圖,不要依賴靜態導入。Fragment 要求 Activity 實現接口是早期設計模式,現代開發建議用 FragmentManager.setFragmentResultListener 或共享 ViewModel 替代。若維護舊代碼,確保 Activity 正確實現接口即可消除 NPE。