android 短信红点,Android-BadgeView-消息红点

本文介绍了如何使用原生代码在BottomNavigationView的菜单项上添加、隐藏和更新消息红点。通过获取BottomNavigationItemView的子View并动态添加和移除红点视图,实现了红点的显示与隐藏。同时提供了在Fragment中更新红点数量的方法,当消息数量达到一定值时,红点将显示为数字或者点状红点。源码可在GitHub找到。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BottomNavigationView+ViewPage2r+Fragment 添加消息红点/数字,可以对红点进行显示、隐藏、更新消息数量操作,原生代码实现。

https://github.com/1900Star/BadgeView-BottomNavigationView

97d01fa8881c

badgeview.jpg

Activity布局 ,Fragment布局就不贴了,可以看源码。

android:id="@+id/vp2"

android:layout_width="match_parent"

android:layout_height="match_parent" />

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);

}

}

更多内容请查看源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值