BottomNavigationView+ViewPage2r+Fragment 添加消息红点/数字,可以对红点进行显示、隐藏、更新消息数量操作,原生代码实现。
https://github.com/1900Star/BadgeView-BottomNavigationView
Activity布局 ,Fragment布局就不贴了,可以看源码。
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bnv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="?android:attr/windowBackground"
app:itemIconTint="@color/color_state_menu_navi"
app:itemTextColor="@color/color_state_menu_navi"
app:labelVisibilityMode="labeled"
app:layout_constraintBottom_toBottomOf="parent"
app:menu="@menu/menu_navigation"
tools:ignore="MissingConstraints" />
主要的代码
BottomNavigationView中,每一个 单独的菜单 BottomNavigationItemView 默认都有两个子View,分别是菜单的图标和菜单的描述文字。通过
BottomNavigationItemView.getChildCount()
可以拿到每个菜单子View的数量,默认数量为 2。即默认的菜单图标(索引为 0)和菜单文字(索引为 1)。
在某个菜单上添加消息红点之后,菜单的子View数量为 3,如果不清除已经添加的红点子View,子View的数量会一直增加。
每次添加红点时都判断当前子View数量是否大于2,大于2 表示当前菜单已经添加红点子View ,
后续更新红点信息就先移除已经添加的红点子View(就是第3个子View,索引为 2),再重新添加新的红点消息。
在Fragment中输入消息数量,点击添加按钮显示红点。
public void showBadgeCount(int menuPosition, int noticeCount) {
int maxNoticeCount = 99;
BottomNavigationMenuView menuView = (BottomNavigationMenuView) mBottomNavigationView.getChildAt(0);
BottomNavigationItemView badgeMenuItemView = (BottomNavigationItemView) menuView.getChildAt(menuPosition);
// 判断当前菜单是否已经添加红点,如果已经添加就先移除。
removeMenuChild(badgeMenuItemView);
View badgeView = LayoutInflater.from(this).inflate(R.layout.notice_badge, menuView, false);
badgeView.setTag(menuPosition);
mMenuSparesArray.put(menuPosition, badgeMenuItemView);
badgeMenuItemView.addView(badgeView);
TextView tvNotic = badgeView.findViewById(R.id.tv_badge);
TextView tvDot = badgeView.findViewById(R.id.tv_badge_dot);
tvDot.setVisibility(noticeCount > maxNoticeCount ? View.VISIBLE : View.GONE);
tvNotic.setVisibility(noticeCount > maxNoticeCount ? View.GONE : View.VISIBLE);
if (noticeCount <= maxNoticeCount) {
tvNotic.setText(String.valueOf(noticeCount));
}
}
消息数量为0时,点击移除按钮移除红点消息。
public void removeBadgeCount(int menuPosition) {
if (mMenuSparesArray.size() > 0) {
BottomNavigationItemView badgeItemView = mMenuSparesArray.get(menuPosition);
removeMenuChild(badgeItemView);
}
}
移除已经添加的红点子View(就是第3个子View,索引为 2)
private void removeMenuChild(BottomNavigationItemView badgeItemView) {
int childCount = 2;
if (badgeItemView.getChildCount() > childCount) {
View childAtView = badgeItemView.getChildAt(2);
badgeItemView.removeView(childAtView);
}
}
更多内容请查看源码
网友评论