Badge on BottomNavigationView

前端 未结 4 1227
隐瞒了意图╮
隐瞒了意图╮ 2020-12-02 02:03

I am trying to add a badge to the BottomNavigationView Item without using any library, however somehow the BottomNavigationView is not showing the

4条回答
  •  独厮守ぢ
    2020-12-02 02:35

    I managed to make BottomNavigationView with the badge. Here is my code (Kotlin).

    This is the panel (inherited from BottomNavigationView)

    /** Bottom menu with badge */
    class AdvancedBottomNavigationView(context: Context, attrs: AttributeSet) : BottomNavigationView(context, attrs) {
    
        private companion object {
            const val BADGE_MIN_WIDTH = 16          // [dp]
            const val BADGE_MARGIN_TOP = 5          // [dp]
            const val BADGE_MARGIN_LEFT = 15        // [dp]
        }
    
        @Inject internal lateinit var uiCalculator: UICalculatorInterface
    
        private val bottomMenuView: BottomNavigationMenuView
    
        init {
            //  Get access to internal menu
            val field = BottomNavigationView::class.java.getDeclaredField("mMenuView")
            field.isAccessible = true
            bottomMenuView = field.get(this) as BottomNavigationMenuView
    
            App.injections.presentationLayerComponent!!.inject(this)
    
            @SuppressLint("CustomViewStyleable")
            val a = context.obtainStyledAttributes(attrs, R.styleable.advanced_bottom_navigation_bar)
            val badgeLayoutId  = a.getResourceId(R.styleable.advanced_bottom_navigation_bar_badge_layout, -1)
            a.recycle()
    
            initBadges(badgeLayoutId)
        }
    
        /**
         * [position] index of menu item */
        fun setBadgeValue(position: Int, count: Int) {
            val menuView = bottomMenuView
            val menuItem = menuView.getChildAt(position) as BottomNavigationItemView
    
            val badge = menuItem.findViewById(R.id.bottom_bar_badge)
            val badgeText = menuItem.findViewById(R.id.bottom_bar_badge_text) as TextView
    
            if (count > 0) {
                badgeText.text = count.toString()
                badge.visibility = View.VISIBLE
            } else {
                badge.visibility = View.GONE
            }
        }
    
        /**
         * Select menu item
         * [position] index of menu item to select
         */
        fun setSelected(position: Int) = bottomMenuView.getChildAt(position).performClick()
    
        private fun initBadges(badgeLayoutId: Int) {
            // Adding badges to each Item
            val menuView = bottomMenuView
            val totalItems = menuView.childCount
    
            val oneItemAreaWidth = uiCalculator.getScreenSize(context).first / totalItems
    
            val marginTop = uiCalculator.dpToPixels(context, BADGE_MARGIN_TOP)
            val marginLeft = uiCalculator.dpToPixels(context, BADGE_MARGIN_LEFT)
    
            for (i in 0 until totalItems) {
                val menuItem = menuView.getChildAt(i) as BottomNavigationItemView
    
                // Add badge to every item
                val badge = View.inflate(context, badgeLayoutId, null) as FrameLayout
                badge.visibility = View.GONE
                badge.minimumWidth = uiCalculator.dpToPixels(context, BADGE_MIN_WIDTH)
    
                val layoutParam = FrameLayout.LayoutParams(
                    FrameLayout.LayoutParams.WRAP_CONTENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT)
                layoutParam.gravity = Gravity.START
    
                layoutParam.setMargins(oneItemAreaWidth / 2 + marginLeft, marginTop, 0, 0)
                menuItem.addView(badge, layoutParam)
            }
        }
     }
    

    It's attr.xml file with options for this component:

    
    
        
            
        
    
    

    Background for badge from drawable folder:

    
    
        
            
                
                
            
        
    
    

    Badge itself:

    
    
    
    
    

    And this is an example how to use it in your code:

    
    
    
        
    
    
    

    I hope this helps you.

提交回复
热议问题