美文网首页
Android-BadgeView-消息红点

Android-BadgeView-消息红点

作者: 丨900 | 来源:发表于2020-03-16 10:21 被阅读0次

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

    badgeview.jpg

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

    更多内容请查看源码

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

    相关文章

      网友评论

          本文标题:Android-BadgeView-消息红点

          本文链接:https://www.haomeiwen.com/subject/davwehtx.html