fix(bottom-navigation): fragment handling (#9243)

This commit is contained in:
Igor Randjelovic
2021-03-16 02:54:31 +01:00
committed by GitHub
parent c040cb28fc
commit 17bdd2ad96
2 changed files with 22 additions and 9 deletions

View File

@ -540,7 +540,9 @@ export class BottomNavigation extends TabNavigationBase {
if (fragment != null) { if (fragment != null) {
fragment.setMenuVisibility(true); 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; this._currentFragment = fragment;
@ -582,8 +584,8 @@ export class BottomNavigation extends TabNavigationBase {
fragmentExitTransition.setResetOnTransitionEnd(true); fragmentExitTransition.setResetOnTransitionEnd(true);
} }
if (fragment && fragment.isAdded() && !fragment.isRemoving()) { if (fragment && fragment.isAdded() && !fragment.isRemoving()) {
const pfm = (<any>fragment).getParentFragmentManager ? (<any>fragment).getParentFragmentManager() : null; const pfm = (<any>fragment).getParentFragmentManager ? (<any>fragment).getParentFragmentManager() : fragmentManager;
if (pfm && !pfm.isDestroyed()) { if (pfm) {
try { try {
if (pfm.isStateSaved()) { if (pfm.isStateSaved()) {
pfm.beginTransaction().remove(fragment).commitNowAllowingStateLoss(); pfm.beginTransaction().remove(fragment).commitNowAllowingStateLoss();

View File

@ -205,13 +205,24 @@ function initializeNativeClasses() {
} }
destroyItem(container: android.view.ViewGroup, position: number, object: java.lang.Object): void { destroyItem(container: android.view.ViewGroup, position: number, object: java.lang.Object): void {
const fragment: androidx.fragment.app.Fragment = <androidx.fragment.app.Fragment>object;
if(fragment.isAdded()) {
if (!this.mCurTransaction) { 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(); const fragmentManager = this.owner._getFragmentManager();
this.mCurTransaction = fragmentManager.beginTransaction(); this.mCurTransaction = fragmentManager.beginTransaction();
} }
const fragment: androidx.fragment.app.Fragment = <androidx.fragment.app.Fragment>object; }
this.mCurTransaction.detach(fragment); this.mCurTransaction.detach(fragment);
}
if (this.mCurrentPrimaryItem === fragment) { if (this.mCurrentPrimaryItem === fragment) {
this.mCurrentPrimaryItem = null; this.mCurrentPrimaryItem = null;