mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 11:42:04 +08:00
Add fragmentForPage method to AndroidFrame interface.
This commit is contained in:
@ -4,6 +4,7 @@ import LabelModule = require("ui/label");
|
||||
import PageTestCommon = require("./page-tests-common");
|
||||
import helper = require("../helper");
|
||||
import frame = require("ui/frame");
|
||||
import types = require("utils/types");
|
||||
|
||||
global.moduleMerge(PageTestCommon, exports);
|
||||
|
||||
@ -139,3 +140,21 @@ export var test_ChangePageCaching_BeforeNavigated_DoesNotThrow = function () {
|
||||
androidFrame.cachePagesOnNavigate = cachingBefore;
|
||||
}
|
||||
}
|
||||
|
||||
export var test_Resolve_Fragment_ForPage = function () {
|
||||
var testPage: PageModule.Page;
|
||||
var pageFactory = function () {
|
||||
var testPage = new PageModule.Page();
|
||||
testPage.content = new LabelModule.Label();
|
||||
return testPage;
|
||||
};
|
||||
|
||||
var topFrame = frame.topmost();
|
||||
|
||||
helper.navigate(pageFactory);
|
||||
|
||||
TKUnit.waitUntilReady(() => topFrame.currentPage !== null && topFrame.currentPage === testPage);
|
||||
|
||||
var fragment = topFrame.android.fragmentForPage(testPage);
|
||||
TKUnit.assertFalse(types.isNullOrUndefined(fragment), "Failed to resolve native fragment for page");
|
||||
}
|
@ -16,6 +16,7 @@ let FRAMEID = "_frameId";
|
||||
let navDepth = -1;
|
||||
let fragmentId = -1;
|
||||
let activityInitialized = false;
|
||||
const PAGE_FRAGMENT_TAG = "_fragmentTag";
|
||||
|
||||
function onFragmentShown(fragment: FragmentClass) {
|
||||
if (trace.enabled) {
|
||||
@ -33,8 +34,9 @@ function onFragmentShown(fragment: FragmentClass) {
|
||||
// TODO: consider putting entry and page in queue so we can safely extract them here. Pass the index of current navigation and extract it from here.
|
||||
// After extracting navigation info - remove this index from navigation stack.
|
||||
var frame = fragment.frame;
|
||||
var entry: definition.BackstackEntry = fragment.entry;
|
||||
var page: pages.Page = entry.resolvedPage;
|
||||
var entry = fragment.entry;
|
||||
var page = entry.resolvedPage;
|
||||
page[PAGE_FRAGMENT_TAG] = entry.fragmentTag;
|
||||
|
||||
let currentNavigationContext;
|
||||
let navigationQueue = (<any>frame)._navigationQueue;
|
||||
@ -70,6 +72,7 @@ function onFragmentHidden(fragment: FragmentClass, destroyed: boolean) {
|
||||
|
||||
var isBack = fragment.entry.isBack;
|
||||
fragment.entry.isBack = undefined;
|
||||
fragment.entry.resolvedPage[PAGE_FRAGMENT_TAG] = undefined;
|
||||
|
||||
// Handle page transitions.
|
||||
transitionModule._onFragmentHidden(fragment, isBack, destroyed);
|
||||
@ -512,6 +515,20 @@ class AndroidFrame extends Observable implements definition.AndroidFrame {
|
||||
// can go back only if it is not the main one.
|
||||
return this.activity.getIntent().getAction() !== android.content.Intent.ACTION_MAIN;
|
||||
}
|
||||
|
||||
public fragmentForPage(page: pages.Page): any {
|
||||
if(!page) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
let tag = page[PAGE_FRAGMENT_TAG];
|
||||
if(tag) {
|
||||
let manager = this.activity.getFragmentManager();
|
||||
return manager.findFragmentByTag(tag);
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
function findPageForFragment(fragment: android.app.Fragment, frame: Frame) {
|
||||
|
6
tns-core-modules/ui/frame/frame.d.ts
vendored
6
tns-core-modules/ui/frame/frame.d.ts
vendored
@ -294,6 +294,12 @@ declare module "ui/frame" {
|
||||
* Gets or sets whether the page UI will be cached when navigating away from the page.
|
||||
*/
|
||||
cachePagesOnNavigate: boolean;
|
||||
|
||||
/**
|
||||
* Finds the native android.app.Fragment instance created for the specified Page.
|
||||
* @param page The Page instance to search for.
|
||||
*/
|
||||
fragmentForPage(page: pages.Page): any;
|
||||
}
|
||||
|
||||
/* tslint:disable */
|
||||
|
Reference in New Issue
Block a user