@@ -234,6 +234,7 @@ export class View extends ViewCommon {
234234 private layoutChangeListenerIsSet : boolean ;
235235 private layoutChangeListener : android . view . View . OnLayoutChangeListener ;
236236 private _manager : android . support . v4 . app . FragmentManager ;
237+ private _rootManager : android . support . v4 . app . FragmentManager ;
237238
238239 nativeViewProtected : android . view . View ;
239240
@@ -265,20 +266,52 @@ export class View extends ViewCommon {
265266 }
266267 }
267268
269+ public _getChildFragmentManager ( ) : android . support . v4 . app . FragmentManager {
270+ return null ;
271+ }
272+
273+ public _getRootFragmentManager ( ) : android . support . v4 . app . FragmentManager {
274+ if ( ! this . _rootManager && this . _context ) {
275+ this . _rootManager = ( < android . support . v4 . app . FragmentActivity > this . _context ) . getSupportFragmentManager ( ) ;
276+ }
277+
278+ return this . _rootManager ;
279+ }
280+
268281 public _getFragmentManager ( ) : android . support . v4 . app . FragmentManager {
269282 let manager = this . _manager ;
270283 if ( ! manager ) {
271284 let view : View = this ;
285+ let frameOrTabViewItemFound = false ;
272286 while ( view ) {
287+ // when interacting with nested fragments instead of using getSupportFragmentManager
288+ // we must always use getChildFragmentManager instead;
289+ // we have three sources of fragments -- Frame fragments, TabViewItem fragments, and
290+ // modal dialog fragments
291+
292+ // modal -> frame / tabview (frame / tabview use modal CHILD fm)
273293 const dialogFragment = view . _dialogFragment ;
274294 if ( dialogFragment ) {
275295 manager = dialogFragment . getChildFragmentManager ( ) ;
276296 break ;
277- } else {
278- // the case is needed because _dialogFragment is on View
279- // but parent may be ViewBase.
280- view = view . parent as View ;
281297 }
298+
299+ // - frame1 -> frame2 (frame2 uses frame1 CHILD fm)
300+ // - tabview -> frame1 (frame1 uses tabview item CHILD fm)
301+ // - frame1 -> tabview (tabview uses frame1 CHILD fm)
302+ // - frame1 -> tabview -> frame2 (tabview uses frame1 CHILD fm; frame2 uses tabview item CHILD fm)
303+ if ( view . _hasFragments ) {
304+ if ( frameOrTabViewItemFound ) {
305+ manager = view . _getChildFragmentManager ( ) ;
306+ break ;
307+ }
308+
309+ frameOrTabViewItemFound = true ;
310+ }
311+
312+ // the case is needed because _dialogFragment is on View
313+ // but parent may be ViewBase.
314+ view = view . parent as View ;
282315 }
283316
284317 if ( ! manager && this . _context ) {
@@ -294,6 +327,7 @@ export class View extends ViewCommon {
294327 @profile
295328 public onLoaded ( ) {
296329 this . _manager = null ;
330+ this . _rootManager = null ;
297331 super . onLoaded ( ) ;
298332 this . setOnTouchListener ( ) ;
299333 }
@@ -307,6 +341,7 @@ export class View extends ViewCommon {
307341 }
308342
309343 this . _manager = null ;
344+ this . _rootManager = null ;
310345 super . onUnloaded ( ) ;
311346 }
312347
@@ -405,6 +440,10 @@ export class View extends ViewCommon {
405440 return false ;
406441 }
407442
443+ get _hasFragments ( ) : boolean {
444+ return false ;
445+ }
446+
408447 public layoutNativeView ( left : number , top : number , right : number , bottom : number ) : void {
409448 if ( this . nativeViewProtected ) {
410449 this . nativeViewProtected . layout ( left , top , right , bottom ) ;
@@ -571,7 +610,7 @@ export class View extends ViewCommon {
571610 this . _dialogFragment = df ;
572611 this . _raiseShowingModallyEvent ( ) ;
573612
574- this . _dialogFragment . show ( parent . _getFragmentManager ( ) , this . _domId . toString ( ) ) ;
613+ this . _dialogFragment . show ( parent . _getRootFragmentManager ( ) , this . _domId . toString ( ) ) ;
575614 }
576615
577616 protected _hideNativeModalView ( parent : View ) {
0 commit comments