1
- import { Application , CoercibleProperty , Color , Enums , Font , Frame , ImageSource , Property , Utils , getTransformedText , isIOS } from '@nativescript/core' ;
1
+ import { Application , CoercibleProperty , Color , Enums , Font , Frame , ImageSource , Property , Utils , getTransformedText , isIOS , View } from '@nativescript/core' ;
2
2
import { TabStrip } from '@nativescript-community/ui-material-core/tab-navigation-base/tab-strip' ;
3
3
import { TabStripItem } from '@nativescript-community/ui-material-core/tab-navigation-base/tab-strip-item' ;
4
4
import { TabContentItem } from '@nativescript-community/ui-material-core/tab-navigation-base/tab-content-item' ;
@@ -14,13 +14,15 @@ const DEFAULT_ELEVATION = 4;
14
14
15
15
const TABID = '_tabId' ;
16
16
const INDEX = '_index' ;
17
+ const ownerSymbol = Symbol ( '_owner' ) ;
17
18
18
19
type PagerAdapter = new ( owner : Tabs ) => androidx . viewpager . widget . PagerAdapter ;
19
20
20
21
// eslint-disable-next-line no-redeclare
21
22
let PagerAdapter : PagerAdapter ;
22
23
let TabsBar : any ;
23
24
let appResources : android . content . res . Resources ;
25
+ let AttachStateChangeListener : any ;
24
26
25
27
function makeFragmentName ( viewId : number , id : number ) : string {
26
28
return 'android:viewpager:' + viewId + ':' + id ;
@@ -326,8 +328,33 @@ function initializeNativeClasses() {
326
328
}
327
329
}
328
330
331
+ @NativeClass
332
+ @Interfaces ( [ android . view . View . OnAttachStateChangeListener ] )
333
+ class AttachListener extends java . lang . Object implements android . view . View . OnAttachStateChangeListener {
334
+ constructor ( ) {
335
+ super ( ) ;
336
+
337
+ return global . __native ( this ) ;
338
+ }
339
+
340
+ onViewAttachedToWindow ( view : android . view . View ) : void {
341
+ const owner : View = view [ ownerSymbol ] ;
342
+ if ( owner ) {
343
+ owner . _onAttachedToWindow ( ) ;
344
+ }
345
+ }
346
+
347
+ onViewDetachedFromWindow ( view : android . view . View ) : void {
348
+ const owner : View = view [ ownerSymbol ] ;
349
+ if ( owner ) {
350
+ owner . _onDetachedFromWindow ( ) ;
351
+ }
352
+ }
353
+ }
354
+
329
355
PagerAdapter = FragmentPagerAdapter ;
330
356
TabsBar = TabsBarImplementation ;
357
+ AttachStateChangeListener = new AttachListener ( ) ;
331
358
appResources = Application . android . context . getResources ( ) ;
332
359
}
333
360
@@ -374,6 +401,7 @@ export class Tabs extends TabsBase {
374
401
private _selectedItemColor : Color ;
375
402
private _unSelectedItemColor : Color ;
376
403
fragments : androidx . fragment . app . Fragment [ ] = [ ] ;
404
+ private _attachedToWindow = false ;
377
405
378
406
constructor ( ) {
379
407
super ( ) ;
@@ -457,13 +485,36 @@ export class Tabs extends TabsBase {
457
485
const nativeView : any = this . nativeViewProtected ;
458
486
this . _tabsBar = nativeView . tabsBar ;
459
487
488
+ // nativeView.addOnAttachStateChangeListener(AttachStateChangeListener);
489
+ nativeView [ ownerSymbol ] = this ;
490
+
460
491
const viewPager = nativeView . viewPager ;
461
492
viewPager . setId ( this . _androidViewId ) ;
462
493
this . _viewPager = viewPager ;
463
494
this . _pagerAdapter = viewPager . adapter ;
464
495
( this . _pagerAdapter as any ) . owner = this ;
465
496
}
466
497
498
+ _onAttachedToWindow ( ) : void {
499
+ super . _onAttachedToWindow ( ) ;
500
+
501
+ // _onAttachedToWindow called from OS again after it was detach
502
+ // TODO: Consider testing and removing it when update to androidx.fragment:1.2.0
503
+ if ( this . _manager && this . _manager . isDestroyed ( ) ) {
504
+ return ;
505
+ }
506
+
507
+ this . _attachedToWindow = true ;
508
+ this . _viewPager . setCurrentItem ( this . selectedIndex , false ) ;
509
+ }
510
+
511
+ _onDetachedFromWindow ( ) : void {
512
+ super . _onDetachedFromWindow ( ) ;
513
+ this . disposeCurrentFragments ( ) ;
514
+
515
+ this . _attachedToWindow = false ;
516
+ }
517
+
467
518
public _loadUnloadTabItems ( newIndex : number ) {
468
519
const items = this . items ;
469
520
if ( ! items ) {
@@ -538,6 +589,9 @@ export class Tabs extends TabsBase {
538
589
( this . _pagerAdapter as any ) . owner = null ;
539
590
this . _pagerAdapter = null ;
540
591
592
+ this . nativeViewProtected . removeOnAttachStateChangeListener ( AttachStateChangeListener ) ;
593
+ this . nativeViewProtected [ ownerSymbol ] = null ;
594
+
541
595
this . _tabsBar = null ;
542
596
this . _viewPager = null ;
543
597
super . disposeNativeView ( ) ;
0 commit comments