mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
Fix: Android pages disappear before their exit transition has finished
Resolves #2000
This commit is contained in:
@@ -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`);
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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*/) {
|
||||||
|
|||||||
2
ui/transition/transition.d.ts
vendored
2
ui/transition/transition.d.ts
vendored
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user