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;
that.on(View.loadedEvent, (args) => {
console.log(`${args.object}.loadedEvent`);
if (topmostFrame().android) {
topmostFrame().android.cachePagesOnNavigate = true;
}
//if (topmostFrame().android) {
// topmostFrame().android.cachePagesOnNavigate = true;
//}
});
that.on(View.unloadedEvent, (args) => {
console.log(`${args.object}.unloadedEvent`);

View File

@@ -61,7 +61,7 @@ function onFragmentShown(fragment: FragmentClass) {
transitionModule._onFragmentShown(fragment, isBack);
}
function onFragmentHidden(fragment: FragmentClass) {
function onFragmentHidden(fragment: FragmentClass, destroyed: boolean) {
trace.write(`HIDDEN ${fragment.getTag()}`, trace.categories.NativeLifecycle);
if (fragment[CLEARING_HISTORY]) {
@@ -74,7 +74,7 @@ function onFragmentHidden(fragment: FragmentClass) {
fragment.entry[IS_BACK] = undefined;
// Handle page transitions.
transitionModule._onFragmentHidden(fragment, isBack);
transitionModule._onFragmentHidden(fragment, isBack, destroyed);
}
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);
super.onHiddenChanged(hidden);
if (hidden) {
onFragmentHidden(this);
onFragmentHidden(this, false);
}
else {
onFragmentShown(this);
@@ -644,14 +644,8 @@ class FragmentClass extends android.app.Fragment {
public onDestroyView(): void {
trace.write(`${this.getTag()}.onDestroyView()`, trace.categories.NativeLifecycle);
super.onDestroyView();
onFragmentHidden(this);
// 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);
}
// Detaching the page has been move in onFragmentHidden due to transitions.
onFragmentHidden(this, true);
}
public onDestroy(): void {

View File

@@ -13,6 +13,7 @@ var ENTER_POPEXIT_TRANSITION = "ENTER_POPEXIT_TRANSITION";
var EXIT_POPENTER_TRANSITION = "EXIT_POPENTER_TRANSITION";
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 DESTROYED = "DESTROYED";
var enterFakeResourceId = -10;
var exitFakeResourceId = -20;
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 relevantTransition = isBack ? ENTER_POPEXIT_TRANSITION : EXIT_POPENTER_TRANSITION;
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) {
// This might be a second call if the fragment is hidden and then destroyed.
_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);
}
}
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*/) {

View File

@@ -23,7 +23,7 @@
export function _setAndroidFragmentTransitions(navigationTransition: frame.NavigationTransition, currentFragment: any, newFragment: any, fragmentTransaction: any): void;
export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): any;
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;
//@endprivate