diff --git a/android/src/main/java/com/google/android/react/navsdk/NavViewManager.java b/android/src/main/java/com/google/android/react/navsdk/NavViewManager.java index d2bc700..7b42bfd 100644 --- a/android/src/main/java/com/google/android/react/navsdk/NavViewManager.java +++ b/android/src/main/java/com/google/android/react/navsdk/NavViewManager.java @@ -304,18 +304,24 @@ public void onDropViewInstance(@NonNull FrameLayout view) { controllerSink.clear(); } - FragmentActivity activity = (FragmentActivity) reactContext.getCurrentActivity(); - if (activity == null) return; - WeakReference weakReference = fragmentMap.remove(viewId); if (weakReference != null) { IMapViewFragment fragment = weakReference.get(); if (fragment != null && fragment.isAdded()) { - activity - .getSupportFragmentManager() - .beginTransaction() - .remove((Fragment) fragment) - .commitNowAllowingStateLoss(); + // Remove via the FragmentManager the fragment is actually attached to. + // reactContext.getCurrentActivity() can be a different Activity than the one hosting the + // fragment (e.g. after Activity recreation), in which case removing through its + // FragmentManager throws "Cannot remove Fragment attached to a different FragmentManager". + try { + ((Fragment) fragment) + .getParentFragmentManager() + .beginTransaction() + .remove((Fragment) fragment) + .commitNowAllowingStateLoss(); + } catch (IllegalStateException e) { + // FragmentManager already destroyed mid-teardown; the fragment is torn down with its + // host Activity anyway. + } } } }