From 683779facbb3ab783688bbe06dce11a48691db47 Mon Sep 17 00:00:00 2001 From: Christian Bernier Date: Fri, 10 Jul 2026 10:59:37 -0400 Subject: [PATCH 1/2] fix: remove NavView fragment via the FragmentManager it is attached to NavViewManager.onDropViewInstance removed the map/navigation fragment through reactContext.getCurrentActivity()'s support FragmentManager. When the view is dropped while getCurrentActivity() points at a different Activity than the one hosting the fragment (e.g. after Activity recreation), that FragmentManager never hosted the fragment and androidx throws: IllegalStateException: Cannot remove Fragment attached to a different FragmentManager Use the fragment's own getParentFragmentManager() for the remove transaction instead, and guard against the FragmentManager being already destroyed mid-teardown. This also no longer skips cleanup (leaking the fragmentMap entry) when getCurrentActivity() is null. --- .../android/react/navsdk/NavViewManager.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) 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 d2bc7004..7b42bfd4 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. + } } } } From 45c8186adae41bd44ba98855f96c531d0da1701a Mon Sep 17 00:00:00 2001 From: Christian Bernier Date: Tue, 11 Aug 2026 11:11:24 -0400 Subject: [PATCH 2/2] refactor: remove redundant comment in onDropViewInstance Requested in review: the code is straightforward and the comment mostly explained the previous behavior. --- .../java/com/google/android/react/navsdk/NavViewManager.java | 4 ---- 1 file changed, 4 deletions(-) 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 7b42bfd4..626eeadb 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 @@ -308,10 +308,6 @@ public void onDropViewInstance(@NonNull FrameLayout view) { if (weakReference != null) { IMapViewFragment fragment = weakReference.get(); if (fragment != null && fragment.isAdded()) { - // 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()