androidx.fragment.app.Fragment$InstantiationException
꽤나 자주 발생했던 것 같다. 이 문제로 앱크러시가 발생해 앱이 꺼지는 문제가 생겼다
유형
java.lang.RuntimeException
Exception java.lang.RuntimeException:
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:4111)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:4277)
at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2443)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loopOnce (Looper.java:226)
at android.os.Looper.loop (Looper.java:313)
at android.app.ActivityThread.main (ActivityThread.java:8751)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1135)
Caused by androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.swmansion.rnscreens.ScreenStackFragment: calling Fragment constructor caused an exception
at androidx.fragment.app.Fragment.instantiate (Fragment.java:631)
at androidx.fragment.app.FragmentContainer.instantiate (FragmentContainer.java:57)
at androidx.fragment.app.FragmentManager$3.instantiate (FragmentManager.java:483)
at androidx.fragment.app.FragmentStateManager.<init> (FragmentStateManager.java:85)
at androidx.fragment.app.FragmentManager.restoreSaveState (FragmentManager.java:2728)
at androidx.fragment.app.FragmentController.restoreSaveState (FragmentController.java:198)
at androidx.fragment.app.FragmentActivity$2.onContextAvailable (FragmentActivity.java:149)
at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable (ContextAwareHelper.java:99)
at androidx.activity.ComponentActivity.onCreate (ComponentActivity.java:352)
at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:273)
at com.facebook.react.ReactActivity.onCreate (ReactActivity.java:45)
at com..MainActivity.onCreate (MainActivity.java:37)
at android.app.Activity.performCreate (Activity.java:8290)
at android.app.Activity.performCreate (Activity.java:8270)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1329)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:4085)
Caused by java.lang.reflect.InvocationTargetException:
at java.lang.reflect.Constructor.newInstance0
at java.lang.reflect.Constructor.newInstance (Constructor.java:343)
at androidx.fragment.app.Fragment.instantiate (Fragment.java:613)
Caused by java.lang.IllegalStateException: Screen fragments should never be restored. Follow instructions from https://github.com/software-mansion/react-native-screens/issues/17#issuecomment-<US_SOCIAL_SECURITY_NUMBER> to properly configure your main activity.
at com.swmansion.rnscreens.ScreenFragment.<init> (ScreenFragment.kt:57)
at com.swmansion.rnscreens.ScreenStackFragment.<init> (ScreenStackFragment.kt:38)
위와 같은 에러 메시지를 공유받았다.
Fragment 란?
프래그먼트(Fragment)는 Android 애플리케이션에서 사용자 인터페이스의 일부를 나타내는 독립적인 구성 요소입니다. 프래그먼트를 사용하면 화면을 여러 부분으로 나누어 재사용 가능하고 모듈화된 UI를 구성할 수 있습니다. 예를 들어, 네비게이션 바, 목록, 세부 정보 보기 등을 각각의 프래그먼트로 분리할 수 있습니다.
문제의 해결책은 MainActivity에 onCreate 메서드에 프래그먼트 매니저가 프래그먼트 상태를 복원하지 않도록 설정하는 것. 이를 위해 MainActivity.java에
기존
protected void onCreate(Bundle savedInstanceState) {
SplashScreen.show(this);
super.onCreate(savedInstanceState);
}
}
변경
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(null); // Call this first with savedInstanceState
SplashScreen.show(this); // Then show the splash screen
if (savedInstanceState != null) {
savedInstanceState.remove("android:support:fragments");
}
}
이렇게 바꿔준 후 앱 빌드 확인!