From 46c17ca3a46a2e8f2d7f73921f8693dfef5b7f43 Mon Sep 17 00:00:00 2001 From: Alexander Djenkov Date: Fri, 19 Jul 2019 17:09:40 +0300 Subject: [PATCH] fix(bottom-navigation): crash when tab selected with no item (#7527) --- .../org/nativescript/widgets/BottomNavigationBar.java | 8 +++++--- .../main/java/org/nativescript/widgets/TabLayout.java | 8 +++++--- .../ui/bottom-navigation/bottom-navigation.android.ts | 10 ++++++++-- tns-core-modules/ui/tabs/tabs.android.ts | 10 ++++++++-- .../android/org.nativescript.widgets.d.ts | 2 +- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/tns-core-modules-widgets/android/widgets/src/main/java/org/nativescript/widgets/BottomNavigationBar.java b/tns-core-modules-widgets/android/widgets/src/main/java/org/nativescript/widgets/BottomNavigationBar.java index b594cd155..29a5c0492 100644 --- a/tns-core-modules-widgets/android/widgets/src/main/java/org/nativescript/widgets/BottomNavigationBar.java +++ b/tns-core-modules-widgets/android/widgets/src/main/java/org/nativescript/widgets/BottomNavigationBar.java @@ -216,8 +216,9 @@ public class BottomNavigationBar extends LinearLayout { lp.weight = 1; } - public void onTap(int position) { + public boolean onTap(int position) { // to be overridden in JS + return true; } public void onSelectedPositionChange(int position, int prevPosition) { @@ -269,8 +270,9 @@ public class BottomNavigationBar extends LinearLayout { public void onClick(View v) { for (int i = 0; i < mTabStrip.getChildCount(); i++) { if (v == mTabStrip.getChildAt(i)) { - onTap(i); - setSelectedPosition(i); + if (onTap(i)) { + setSelectedPosition(i); + } return; } } diff --git a/tns-core-modules-widgets/android/widgets/src/main/java/org/nativescript/widgets/TabLayout.java b/tns-core-modules-widgets/android/widgets/src/main/java/org/nativescript/widgets/TabLayout.java index fad929b9c..a784d5431 100644 --- a/tns-core-modules-widgets/android/widgets/src/main/java/org/nativescript/widgets/TabLayout.java +++ b/tns-core-modules-widgets/android/widgets/src/main/java/org/nativescript/widgets/TabLayout.java @@ -301,8 +301,9 @@ public class TabLayout extends HorizontalScrollView { } } - public void onTap(int position) { + public boolean onTap(int position) { // to be overridden in JS + return true; } public void onSelectedPositionChange(int position, int prevPosition) { @@ -429,8 +430,9 @@ public class TabLayout extends HorizontalScrollView { public void onClick(View v) { for (int i = 0; i < mTabStrip.getChildCount(); i++) { if (v == mTabStrip.getChildAt(i)) { - onTap(i); - mViewPager.setCurrentItem(i); + if (onTap(i)) { + mViewPager.setCurrentItem(i); + } return; } } diff --git a/tns-core-modules/ui/bottom-navigation/bottom-navigation.android.ts b/tns-core-modules/ui/bottom-navigation/bottom-navigation.android.ts index b24ddbdd6..18da53cff 100644 --- a/tns-core-modules/ui/bottom-navigation/bottom-navigation.android.ts +++ b/tns-core-modules/ui/bottom-navigation/bottom-navigation.android.ts @@ -118,10 +118,10 @@ function initializeNativeClasses() { owner.selectedIndex = position; } - public onTap(position: number): void { + public onTap(position: number): boolean { const owner = this.owner; if (!owner) { - return; + return false; } const tabStripItems = owner.tabStrip && owner.tabStrip.items; @@ -129,6 +129,12 @@ function initializeNativeClasses() { if (position >= 0 && tabStripItems[position]) { tabStripItems[position]._emit(TabStripItem.tapEvent); } + + if (!owner.items[position]) { + return false; + } + + return true; } } diff --git a/tns-core-modules/ui/tabs/tabs.android.ts b/tns-core-modules/ui/tabs/tabs.android.ts index 56435aef1..c7a5e2d55 100644 --- a/tns-core-modules/ui/tabs/tabs.android.ts +++ b/tns-core-modules/ui/tabs/tabs.android.ts @@ -259,10 +259,10 @@ function initializeNativeClasses() { } } - public onTap(position: number): void { + public onTap(position: number): boolean { const owner = this.owner; if (!owner) { - return; + return false; } const tabStripItems = owner.tabStrip && owner.tabStrip.items; @@ -270,6 +270,12 @@ function initializeNativeClasses() { if (position >= 0 && tabStripItems[position]) { tabStripItems[position]._emit(TabStripItem.tapEvent); } + + if (!owner.items[position]) { + return false; + } + + return true; } } diff --git a/tns-platform-declarations/android/org.nativescript.widgets.d.ts b/tns-platform-declarations/android/org.nativescript.widgets.d.ts index e2d2b424f..33ab960a1 100644 --- a/tns-platform-declarations/android/org.nativescript.widgets.d.ts +++ b/tns-platform-declarations/android/org.nativescript.widgets.d.ts @@ -410,7 +410,7 @@ setTabTextFontSize(fontSize: number): void; getTabTextFontSize(): number; - onTap(position: number): void; + onTap(position: number): boolean; onSelectedPositionChange(position: number, prevPosition: number): void ; setSelectedPosition(position: number): void; setItems(items: Array): void;