Fix: Android pages disappear before their exit transition has finished

Resolves #2000
This commit is contained in:
Rossen Hristov
2016-04-20 17:02:35 +03:00
parent 4c761e8390
commit b3f36644c1
4 changed files with 24 additions and 16 deletions

View File

@@ -40,9 +40,9 @@ export class NavPage extends Page implements definition.ControlsPage {
var that = this; var that = this;
that.on(View.loadedEvent, (args) => { that.on(View.loadedEvent, (args) => {
console.log(`${args.object}.loadedEvent`); console.log(`${args.object}.loadedEvent`);
if (topmostFrame().android) { //if (topmostFrame().android) {
topmostFrame().android.cachePagesOnNavigate = true; // topmostFrame().android.cachePagesOnNavigate = true;
} //}
}); });
that.on(View.unloadedEvent, (args) => { that.on(View.unloadedEvent, (args) => {
console.log(`${args.object}.unloadedEvent`); console.log(`${args.object}.unloadedEvent`);

View File

@@ -61,7 +61,7 @@ function onFragmentShown(fragment: FragmentClass) {
transitionModule._onFragmentShown(fragment, isBack); transitionModule._onFragmentShown(fragment, isBack);
} }
function onFragmentHidden(fragment: FragmentClass) { function onFragmentHidden(fragment: FragmentClass, destroyed: boolean) {
trace.write(`HIDDEN ${fragment.getTag()}`, trace.categories.NativeLifecycle); trace.write(`HIDDEN ${fragment.getTag()}`, trace.categories.NativeLifecycle);
if (fragment[CLEARING_HISTORY]) { if (fragment[CLEARING_HISTORY]) {
@@ -74,7 +74,7 @@ function onFragmentHidden(fragment: FragmentClass) {
fragment.entry[IS_BACK] = undefined; fragment.entry[IS_BACK] = undefined;
// Handle page transitions. // Handle page transitions.
transitionModule._onFragmentHidden(fragment, isBack); transitionModule._onFragmentHidden(fragment, isBack, destroyed);
} }
export class Frame extends frameCommon.Frame { export class Frame extends frameCommon.Frame {
@@ -580,7 +580,7 @@ class FragmentClass extends android.app.Fragment {
trace.write(`${this.getTag()}.onHiddenChanged(${hidden})`, trace.categories.NativeLifecycle); trace.write(`${this.getTag()}.onHiddenChanged(${hidden})`, trace.categories.NativeLifecycle);
super.onHiddenChanged(hidden); super.onHiddenChanged(hidden);
if (hidden) { if (hidden) {
onFragmentHidden(this); onFragmentHidden(this, false);
} }
else { else {
onFragmentShown(this); onFragmentShown(this);
@@ -644,14 +644,8 @@ class FragmentClass extends android.app.Fragment {
public onDestroyView(): void { public onDestroyView(): void {
trace.write(`${this.getTag()}.onDestroyView()`, trace.categories.NativeLifecycle); trace.write(`${this.getTag()}.onDestroyView()`, trace.categories.NativeLifecycle);
super.onDestroyView(); super.onDestroyView();
onFragmentHidden(this); // Detaching the page has been move in onFragmentHidden due to transitions.
onFragmentHidden(this, true);
// When Fragment is destroyed we detach page even if cachePagesOnNavigate is true.
let entry = this.entry;
let page = entry.resolvedPage;
if (page._context) {
page._onDetached(true);
}
} }
public onDestroy(): void { public onDestroy(): void {

View File

@@ -13,6 +13,7 @@ var ENTER_POPEXIT_TRANSITION = "ENTER_POPEXIT_TRANSITION";
var EXIT_POPENTER_TRANSITION = "EXIT_POPENTER_TRANSITION"; var EXIT_POPENTER_TRANSITION = "EXIT_POPENTER_TRANSITION";
var COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS = "COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS"; var COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS = "COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS";
var COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS = "COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS"; var COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS = "COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS";
var DESTROYED = "DESTROYED";
var enterFakeResourceId = -10; var enterFakeResourceId = -10;
var exitFakeResourceId = -20; var exitFakeResourceId = -20;
var popEnterFakeResourceId = -30; var popEnterFakeResourceId = -30;
@@ -241,7 +242,7 @@ export function _onFragmentShown(fragment: android.app.Fragment, isBack: boolean
} }
} }
export function _onFragmentHidden(fragment: android.app.Fragment, isBack: boolean) { export function _onFragmentHidden(fragment: android.app.Fragment, isBack: boolean, destroyed: boolean) {
var transitionType = isBack ? "Pop Exit" : "Exit"; var transitionType = isBack ? "Pop Exit" : "Exit";
var relevantTransition = isBack ? ENTER_POPEXIT_TRANSITION : EXIT_POPENTER_TRANSITION; var relevantTransition = isBack ? ENTER_POPEXIT_TRANSITION : EXIT_POPENTER_TRANSITION;
if (fragment[relevantTransition]) { if (fragment[relevantTransition]) {
@@ -256,6 +257,8 @@ export function _onFragmentHidden(fragment: android.app.Fragment, isBack: boolea
} }
} }
fragment[DESTROYED] = destroyed;
if (fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS] === undefined) { if (fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS] === undefined) {
// This might be a second call if the fragment is hidden and then destroyed. // This might be a second call if the fragment is hidden and then destroyed.
_completePageRemoval(fragment, true, isBack); _completePageRemoval(fragment, true, isBack);
@@ -291,6 +294,17 @@ function _completePageRemoval(fragment: android.app.Fragment, force: boolean = f
trace.write(`REMOVAL of ${page} has already been done`, trace.categories.Transition); trace.write(`REMOVAL of ${page} has already been done`, trace.categories.Transition);
} }
} }
if (fragment[DESTROYED]) {
fragment[DESTROYED] = undefined;
if (page._context) {
page._onDetached(true);
trace.write(`DETACHMENT of ${page} completed`, trace.categories.Transition);
}
else {
trace.write(`DETACHMENT of ${page} has already been done`, trace.categories.Transition);
}
}
} }
function _addNativeTransitionListener(fragment: android.app.Fragment, nativeTransition: any/*android.transition.Transition*/) { function _addNativeTransitionListener(fragment: android.app.Fragment, nativeTransition: any/*android.transition.Transition*/) {

View File

@@ -23,7 +23,7 @@
export function _setAndroidFragmentTransitions(navigationTransition: frame.NavigationTransition, currentFragment: any, newFragment: any, fragmentTransaction: any): void; export function _setAndroidFragmentTransitions(navigationTransition: frame.NavigationTransition, currentFragment: any, newFragment: any, fragmentTransaction: any): void;
export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): any; export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): any;
export function _onFragmentShown(fragment: any, isBack: boolean): void; export function _onFragmentShown(fragment: any, isBack: boolean): void;
export function _onFragmentHidden(fragment: any, isBack: boolean): void; export function _onFragmentHidden(fragment: any, isBack: boolean, destroyed: boolean): void;
export function _createIOSAnimatedTransitioning(navigationTransition: frame.NavigationTransition, nativeCurve: any, operation: number, fromVC: any, toVC: any): any; export function _createIOSAnimatedTransitioning(navigationTransition: frame.NavigationTransition, nativeCurve: any, operation: number, fromVC: any, toVC: any): any;
//@endprivate //@endprivate