Merge pull request #2214 from NativeScript/atanasovg/expose-fragments-1

[Second Try] Add API that resolves the native android.app.Fragment instance created for a Page
This commit is contained in:
Georgi Atanasov
2016-06-01 14:04:26 +03:00
3 changed files with 48 additions and 2 deletions

View File

@@ -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);
@@ -138,4 +139,26 @@ export var test_ChangePageCaching_BeforeNavigated_DoesNotThrow = function () {
finally {
androidFrame.cachePagesOnNavigate = cachingBefore;
}
}
export var test_Resolve_Fragment_ForPage = function () {
var testPage: PageModule.Page;
var navigatedTo = false;
var pageFactory = function () {
testPage = new PageModule.Page();
testPage.content = new LabelModule.Label();
// use navigatedTo to ensure the fragment is already created
testPage.on("navigatedTo", function(args) {
navigatedTo = true;
});
return testPage;
};
helper.navigate(pageFactory);
TKUnit.waitUntilReady(() => navigatedTo === true);
var fragment = frame.topmost().android.fragmentForPage(testPage);
TKUnit.assertFalse(types.isNullOrUndefined(fragment), "Failed to resolve native fragment for page");
}

View File

@@ -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;
@@ -68,6 +70,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);
@@ -510,6 +513,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) {

View File

@@ -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 */