Skip to content

Commit 8a8878d

Browse files
committed
feat: report tab bar height on Android
1 parent 25ea78a commit 8a8878d

File tree

7 files changed

+47
-2
lines changed

7 files changed

+47
-2
lines changed

.changeset/shaky-rules-sing.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'react-native-bottom-tabs': patch
3+
---
4+
5+
feat: report tab bar measurements on Android

apps/example/src/Screens/Contacts.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ export function Contacts({ query, ...rest }: Props) {
125125
renderItem={renderItem}
126126
ItemSeparatorComponent={ItemSeparator}
127127
/>
128-
<MusicControl bottomOffset={tabBarHeight} />
128+
<MusicControl bottomOffset={Platform.OS === 'ios' ? tabBarHeight : 0} />
129129
</SafeAreaView>
130130
);
131131
}

packages/react-native-bottom-tabs/android/src/main/java/com/rcttabview/RCTTabView.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class ReactBottomNavigationView(context: Context) : LinearLayout(context) {
4141
var onTabSelectedListener: ((key: String) -> Unit)? = null
4242
var onTabLongPressedListener: ((key: String) -> Unit)? = null
4343
var onNativeLayoutListener: ((width: Double, height: Double) -> Unit)? = null
44+
var onTabBarMeasuredListener: ((height: Int) -> Unit)? = null
4445
var disablePageAnimations = false
4546
var items: MutableList<TabInfo> = mutableListOf()
4647
private val iconSources: MutableMap<Int, ImageSource> = mutableMapOf()
@@ -90,6 +91,9 @@ class ReactBottomNavigationView(context: Context) : LinearLayout(context) {
9091
val newWidth = right - left
9192
val newHeight = bottom - top
9293

94+
// Notify about tab bar height.
95+
onTabBarMeasuredListener?.invoke(Utils.convertPixelsToDp(context, bottomNavigation.height).toInt())
96+
9397
if (newWidth != lastReportedSize?.width || newHeight != lastReportedSize?.height) {
9498
val dpWidth = Utils.convertPixelsToDp(context, layoutHolder.width)
9599
val dpHeight = Utils.convertPixelsToDp(context, layoutHolder.height)

packages/react-native-bottom-tabs/android/src/main/java/com/rcttabview/RCTTabViewImpl.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.view.ViewGroup
66
import com.facebook.react.bridge.ReadableArray
77
import com.facebook.react.common.MapBuilder
88
import com.rcttabview.events.OnNativeLayoutEvent
9+
import com.rcttabview.events.OnTabBarMeasuredEvent
910
import com.rcttabview.events.PageSelectedEvent
1011
import com.rcttabview.events.TabLongPressEvent
1112

@@ -91,7 +92,9 @@ class RCTTabViewImpl {
9192
TabLongPressEvent.EVENT_NAME,
9293
MapBuilder.of("registrationName", "onTabLongPress"),
9394
OnNativeLayoutEvent.EVENT_NAME,
94-
MapBuilder.of("registrationName", "onNativeLayout")
95+
MapBuilder.of("registrationName", "onNativeLayout"),
96+
OnTabBarMeasuredEvent.EVENT_NAME,
97+
MapBuilder.of("registrationName", "onTabBarMeasured")
9598
)
9699
}
97100

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.rcttabview.events
2+
3+
import com.facebook.react.bridge.Arguments
4+
import com.facebook.react.uimanager.events.Event
5+
import com.facebook.react.uimanager.events.RCTEventEmitter
6+
7+
class OnTabBarMeasuredEvent(viewTag: Int, private val height: Int) :
8+
Event<TabLongPressEvent>(viewTag) {
9+
10+
companion object {
11+
const val EVENT_NAME = "onTabBarMeasured"
12+
}
13+
14+
override fun getEventName(): String {
15+
return EVENT_NAME
16+
}
17+
18+
override fun dispatch(rctEventEmitter: RCTEventEmitter) {
19+
val event = Arguments.createMap().apply {
20+
putInt("height", height)
21+
}
22+
rctEventEmitter.receiveEvent(viewTag, eventName, event)
23+
}
24+
}

packages/react-native-bottom-tabs/android/src/newarch/RCTTabViewManager.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.facebook.react.uimanager.ViewManagerDelegate
1212
import com.facebook.react.viewmanagers.RNCTabViewManagerDelegate
1313
import com.facebook.react.viewmanagers.RNCTabViewManagerInterface
1414
import com.rcttabview.events.OnNativeLayoutEvent
15+
import com.rcttabview.events.OnTabBarMeasuredEvent
1516
import com.rcttabview.events.PageSelectedEvent
1617
import com.rcttabview.events.TabLongPressEvent
1718

@@ -39,6 +40,9 @@ class RCTTabViewManager(context: ReactApplicationContext) :
3940
view.onNativeLayoutListener = { width, height ->
4041
eventDispatcher?.dispatchEvent(OnNativeLayoutEvent(viewTag = view.id, width, height))
4142
}
43+
view.onTabBarMeasuredListener = { height ->
44+
eventDispatcher?.dispatchEvent(OnTabBarMeasuredEvent(viewTag = view.id, height))
45+
}
4246
return view
4347

4448
}

packages/react-native-bottom-tabs/android/src/oldarch/RCTTabViewManager.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.facebook.react.bridge.ReadableArray
1010
import com.facebook.react.uimanager.UIManagerModule
1111
import com.facebook.react.uimanager.ViewGroupManager
1212
import com.rcttabview.events.OnNativeLayoutEvent
13+
import com.rcttabview.events.OnTabBarMeasuredEvent
1314
import com.rcttabview.events.PageSelectedEvent
1415
import com.rcttabview.events.TabLongPressEvent
1516

@@ -36,6 +37,10 @@ class RCTTabViewManager(context: ReactApplicationContext) : ViewGroupManager<Rea
3637
view.onNativeLayoutListener = { width, height ->
3738
eventDispatcher.dispatchEvent(OnNativeLayoutEvent(viewTag = view.id, width, height))
3839
}
40+
41+
view.onTabBarMeasuredListener = { height ->
42+
eventDispatcher.dispatchEvent(OnTabBarMeasuredEvent(viewTag = view.id, height))
43+
}
3944
return view
4045
}
4146

0 commit comments

Comments
 (0)