Skip to content

Commit ef7dece

Browse files
committed
fix(bottom-navigation): port of N fix NativeScript/NativeScript@4690162
1 parent 9bfc80b commit ef7dece

File tree

1 file changed

+66
-27
lines changed

1 file changed

+66
-27
lines changed

src/bottom-navigation/index.android.ts

Lines changed: 66 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ function initializeNativeClasses() {
179179
tabStrip.notify({
180180
eventName: TabStrip.itemTapEvent,
181181
object: tabStrip,
182-
index: position,
182+
index: position
183183
});
184184
}
185185

@@ -420,7 +420,7 @@ export class BottomNavigation extends TabNavigationBase {
420420
const fragmentToDetach = this._currentFragment;
421421
if (fragmentToDetach) {
422422
this.destroyItem((fragmentToDetach as any).index, fragmentToDetach);
423-
this.commitCurrentTransaction();
423+
this.removeFragment(fragmentToDetach);
424424
}
425425
}
426426

@@ -446,28 +446,41 @@ export class BottomNavigation extends TabNavigationBase {
446446

447447
private disposeTabFragments(): void {
448448
const fragmentManager = this._getFragmentManager();
449-
const transaction = fragmentManager.beginTransaction();
450449
const fragments = fragmentManager.getFragments().toArray();
451450
for (let i = 0; i < fragments.length; i++) {
452-
transaction.remove(fragments[i]);
451+
this.removeFragment(fragments[i]);
453452
}
454-
455-
transaction.commitNowAllowingStateLoss();
456-
}
457-
458-
private get currentTransaction(): androidx.fragment.app.FragmentTransaction {
459-
if (!this._currentTransaction) {
460-
const fragmentManager = this._getFragmentManager();
461-
this._currentTransaction = fragmentManager.beginTransaction();
462-
}
463-
464-
return this._currentTransaction;
465453
}
466-
467-
private commitCurrentTransaction(): void {
468-
if (this._currentTransaction) {
469-
this._currentTransaction.commitNowAllowingStateLoss();
470-
this._currentTransaction = null;
454+
private attachFragment(fragment: androidx.fragment.app.Fragment, id?: number, name?: string): void {
455+
const fragmentManager = this._getFragmentManager();
456+
if (fragment) {
457+
if (fragment.isAdded() || fragment.isRemoving()) {
458+
// ignore
459+
} else {
460+
const fragmentExitTransition = fragment.getExitTransition();
461+
if (fragmentExitTransition && fragmentExitTransition instanceof org.nativescript.widgets.CustomTransition) {
462+
fragmentExitTransition.setResetOnTransitionEnd(true);
463+
}
464+
if (fragmentManager) {
465+
if (!fragmentManager.isDestroyed()) {
466+
try {
467+
if (fragmentManager.isStateSaved()) {
468+
if (id && name) {
469+
fragmentManager.beginTransaction().add(id, fragment, name).commitNowAllowingStateLoss();
470+
} else {
471+
fragmentManager.beginTransaction().attach(fragment).commitNowAllowingStateLoss();
472+
}
473+
} else {
474+
if (id && name) {
475+
fragmentManager.beginTransaction().add(id, fragment, name).commitNow();
476+
} else {
477+
fragmentManager.beginTransaction().attach(fragment).commitNow();
478+
}
479+
}
480+
} catch (e) {}
481+
}
482+
}
483+
}
471484
}
472485
}
473486

@@ -487,8 +500,6 @@ export class BottomNavigation extends TabNavigationBase {
487500

488501
const fragment = this.instantiateItem(this._contentView, index);
489502
this.setPrimaryItem(index, fragment);
490-
491-
this.commitCurrentTransaction();
492503
}
493504

494505
private instantiateItem(container: android.view.ViewGroup, position: number): androidx.fragment.app.Fragment {
@@ -497,10 +508,10 @@ export class BottomNavigation extends TabNavigationBase {
497508
const fragmentManager = this._getFragmentManager();
498509
let fragment: androidx.fragment.app.Fragment = fragmentManager.findFragmentByTag(name);
499510
if (fragment != null) {
500-
this.currentTransaction.attach(fragment);
511+
this.attachFragment(fragment);
501512
} else {
502513
fragment = TabFragment.newInstance(this._domId, position);
503-
this.currentTransaction.add(container.getId(), fragment, name);
514+
this.attachFragment(fragment, container.getId(), name);
504515
}
505516

506517
if (fragment !== this._currentFragment) {
@@ -537,7 +548,7 @@ export class BottomNavigation extends TabNavigationBase {
537548

538549
private destroyItem(position: number, fragment: androidx.fragment.app.Fragment): void {
539550
if (fragment) {
540-
this.currentTransaction.detach(fragment);
551+
this.removeFragment(fragment);
541552
if (this._currentFragment === fragment) {
542553
this._currentFragment = null;
543554
}
@@ -547,6 +558,34 @@ export class BottomNavigation extends TabNavigationBase {
547558
this.items[position].canBeLoaded = false;
548559
}
549560
}
561+
private removeFragment(fragment: androidx.fragment.app.Fragment, fragmentManager?: any) {
562+
if (!fragmentManager) {
563+
fragmentManager = this._getFragmentManager();
564+
}
565+
if (fragment) {
566+
if (!fragment.isAdded() || fragment.isRemoving()) {
567+
// ignore
568+
return;
569+
} else {
570+
const fragmentExitTransition = fragment.getExitTransition();
571+
if (fragmentExitTransition && fragmentExitTransition instanceof org.nativescript.widgets.CustomTransition) {
572+
fragmentExitTransition.setResetOnTransitionEnd(true);
573+
}
574+
if (fragment && fragment.isAdded() && !fragment.isRemoving()) {
575+
const pfm = (fragment as any).getParentFragmentManager ? (fragment as any).getParentFragmentManager() : null;
576+
if (pfm && !pfm.isDestroyed()) {
577+
try {
578+
if (pfm.isStateSaved()) {
579+
pfm.beginTransaction().remove(fragment).commitNowAllowingStateLoss();
580+
} else {
581+
pfm.beginTransaction().remove(fragment).commitNow();
582+
}
583+
} catch (e) {}
584+
}
585+
}
586+
}
587+
}
588+
}
550589

551590
private setTabStripItems(items: TabStripItem[]) {
552591
if (!this.tabStrip || !items) {
@@ -665,7 +704,7 @@ export class BottomNavigation extends TabNavigationBase {
665704

666705
return {
667706
drawable: imageDrawable,
668-
height: image.getHeight(),
707+
height: image.getHeight()
669708
};
670709
}
671710

@@ -684,7 +723,7 @@ export class BottomNavigation extends TabNavigationBase {
684723

685724
const iconSpecSize = getIconSpecSize({
686725
width: inWidth,
687-
height: inHeight,
726+
height: inHeight
688727
});
689728

690729
const widthPixels = iconSpecSize.width * Utils.layout.getDisplayDensity();

0 commit comments

Comments
 (0)