fix: crash on Android Tab-View #6466 (#6467)

* fix: crash on Android Tab-View NativeScript#6466

This fix has been tested in production with no new issues occurring.

Long-term solution would be one of the following, though:
1. reintroduce overrides for `saveState`/`restoreState` in the current PagerAdapter implementation (removed on this commit NativeScript@ac04ede#diff-f1459d509d1432b432c29bcd30e462fbL97)
2. use FragmentPagerAdapter
3. use FragmentStatePagerAdapter

Both 2 and 3 manage the save/restore cycles. The main difference between 2 and 3 is that 2 uses more memory, but allows for quicker switching between Fragments than 3. Since tabs should usually be limited to 5 or less, this may be the best choice to maintain performance, which is important for top level navigation tabs.

When I have more time I may experiment with these options myself to see what the difference to performance and memory consumption is for each.

* refactor: _commitCurrentTransaction method+comment

* chore: fix typo

* fix: missing class definition
This commit is contained in:
Dick Smith
2018-11-14 10:53:38 -05:00
committed by Alexander Vakrilov
parent 7df8038d09
commit db33cf313c

View File

@ -200,10 +200,7 @@ function initializeNativeClasses() {
}
finishUpdate(container: android.view.ViewGroup): void {
if (this.mCurTransaction != null) {
(<any>this.mCurTransaction).commitNowAllowingStateLoss();
this.mCurTransaction = null;
}
this._commitCurrentTransaction();
}
isViewFromObject(view: android.view.View, object: java.lang.Object): boolean {
@ -211,6 +208,9 @@ function initializeNativeClasses() {
}
saveState(): android.os.Parcelable {
// Commit the current transaction on save to prevent "No view found for id 0xa" exception on restore.
// Related to: https://github.com/NativeScript/NativeScript/issues/6466
this._commitCurrentTransaction();
return null;
}
@ -221,8 +221,15 @@ function initializeNativeClasses() {
getItemId(position: number): number {
return position;
}
}
private _commitCurrentTransaction() {
if (this.mCurTransaction != null) {
this.mCurTransaction.commitNowAllowingStateLoss();
this.mCurTransaction = null;
}
}
}
PagerAdapter = FragmentPagerAdapter;
}
@ -713,4 +720,4 @@ function tryCloneDrawable(value: android.graphics.drawable.Drawable, resources:
}
return value;
}
}