From 17bdd2ad967c024d0f15584560e36683e321b19b Mon Sep 17 00:00:00 2001 From: Igor Randjelovic Date: Tue, 16 Mar 2021 02:54:31 +0100 Subject: [PATCH] fix(bottom-navigation): fragment handling (#9243) --- .../bottom-navigation.android.ts | 8 ++++--- nativescript-core/ui/tabs/tabs.android.ts | 23 ++++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/nativescript-core/ui/bottom-navigation/bottom-navigation.android.ts b/nativescript-core/ui/bottom-navigation/bottom-navigation.android.ts index 6aed0101c..6f133e4f9 100644 --- a/nativescript-core/ui/bottom-navigation/bottom-navigation.android.ts +++ b/nativescript-core/ui/bottom-navigation/bottom-navigation.android.ts @@ -540,7 +540,9 @@ export class BottomNavigation extends TabNavigationBase { if (fragment != null) { fragment.setMenuVisibility(true); - fragment.setUserVisibleHint(true); + // commenting out as it fixes rare crash when going + // back from deeply nested/modally shown fragments + // fragment.setUserVisibleHint(true); } this._currentFragment = fragment; @@ -582,8 +584,8 @@ export class BottomNavigation extends TabNavigationBase { fragmentExitTransition.setResetOnTransitionEnd(true); } if (fragment && fragment.isAdded() && !fragment.isRemoving()) { - const pfm = (fragment).getParentFragmentManager ? (fragment).getParentFragmentManager() : null; - if (pfm && !pfm.isDestroyed()) { + const pfm = (fragment).getParentFragmentManager ? (fragment).getParentFragmentManager() : fragmentManager; + if (pfm) { try { if (pfm.isStateSaved()) { pfm.beginTransaction().remove(fragment).commitNowAllowingStateLoss(); diff --git a/nativescript-core/ui/tabs/tabs.android.ts b/nativescript-core/ui/tabs/tabs.android.ts index 7b85c489a..b440a7aca 100644 --- a/nativescript-core/ui/tabs/tabs.android.ts +++ b/nativescript-core/ui/tabs/tabs.android.ts @@ -205,13 +205,24 @@ function initializeNativeClasses() { } destroyItem(container: android.view.ViewGroup, position: number, object: java.lang.Object): void { - if (!this.mCurTransaction) { - const fragmentManager = this.owner._getFragmentManager(); - this.mCurTransaction = fragmentManager.beginTransaction(); - } - const fragment: androidx.fragment.app.Fragment = object; - this.mCurTransaction.detach(fragment); + + if(fragment.isAdded()) { + if (!this.mCurTransaction) { + try { + // try to get the correct FragmentManager + // @ts-ignore + const fragmentManager = fragment.getParentFragmentManager() + this.mCurTransaction = fragmentManager.beginTransaction(); + } catch (err) { + const fragmentManager = this.owner._getFragmentManager(); + this.mCurTransaction = fragmentManager.beginTransaction(); + } + + } + + this.mCurTransaction.detach(fragment); + } if (this.mCurrentPrimaryItem === fragment) { this.mCurrentPrimaryItem = null;