【问题标题】:Can't show badge at bottomNavigationView无法在底部导航视图中显示徽章
【发布时间】:2020-01-27 07:12:47
【问题描述】:

我有一些方法可以在我的bottomNavigtionView 上的某些项目上显示徽章。这里是:

private fun addBadgeView() {
        val menuView = mainNavigationView.getChildAt(0) as BottomNavigationMenuView
        val itemView = menuView.getChildAt(1) as BottomNavigationItemView
        val notificationBadge = LayoutInflater.from(this).inflate(R.layout.notification_badge, menuView, false)
        val textView = notificationBadge.findViewById<TextView>(R.id.counter_badge)
        val itemView1 = menuView.getChildAt(2) as BottomNavigationItemView
        val notificationBadgeOne = LayoutInflater.from(this).inflate(R.layout.notification_badge, menuView, false)
        val textView1 = notificationBadgeOne.findViewById<TextView>(R.id.counter_badge)

        val itemView2 = menuView.getChildAt(3) as BottomNavigationItemView
        val notificationBadge2 = LayoutInflater.from(this).inflate(R.layout.notification_badge, menuView, false)
        val textView2 = notificationBadge2.findViewById<TextView>(R.id.counter_badge)

        when {
            sp!!.getInt("notepad_count", 0) > 99 -> textView2.text = resources.getText(R.string.more90)
            sp!!.getInt("notepad_count", 0) < 99 -> textView2.text = sp!!.getInt("notepad_count", 0).toString()
            sp!!.getInt("notepad_count", 0) == 0 -> textView2.visibility = View.GONE
        }

        if (sp!!.getString("new_receivedM", "")!!.isNotEmpty()) {
            when {
                Integer.parseInt(sp!!.getString("new_receivedM", "")!!) > 99 -> textView.text = resources.getText(R.string.more90)
                sp!!.getString("new_receivedM", "") == "0" -> textView.visibility = View.GONE
                else -> textView.text = sp!!.getString("new_receivedM", "")
            }
        } else run { textView.visibility = View.GONE }


        if (sp!!.getString("all_jobs", "")!!.isNotEmpty()) {
            when {
                Integer.parseInt(sp!!.getString("all_jobs", "")!!) > 99 -> textView1.text = resources.getText(R.string.more90)
                sp!!.getString("all_jobs", "") == "0" -> textView1.visibility = View.GONE
                else -> textView1.text = sp!!.getString("all_jobs", "")
            }
        } else {
            textView1.visibility = View.GONE
        }

        itemView.addView(notificationBadge)
        itemView1.addView(notificationBadgeOne)
        itemView2.addView(notificationBadge2)
    }

但有时我想在某些条件下删除一些项目,所以我在这里添加了小条件:

val set = sp!!.getStringSet("disabled_app_modules", HashSet<String>())

if (set!!.isNotEmpty()) {
   val list: ArrayList<String> = ArrayList()
   list.addAll(set)
   for (i in 0 until list.size) {
    when (list[i].substring(1, list[i].length - 1)) {

      "notepad" -> {
         bottomNavigationView.menu.removeItem(R.id.notespec)
       }
     }
 }
}

然后我检查我的bottomNavigationView 是否包含这些项目:

if (bottomNavigationView.getChildAt(2) != null) {
            val itemView1 = menuView.getChildAt(2) as BottomNavigationItemView
            val notificationBadgeOne = LayoutInflater.from(this).inflate(R.layout.notification_badge, menuView, false)
            val textView1 = notificationBadgeOne.findViewById<TextView>(R.id.counter_badge)

            if (sp!!.getString("all_jobs", "")!!.isNotEmpty()) {
                when {
                    Integer.parseInt(sp!!.getString("all_jobs", "")!!) > 99 -> textView1.text = resources.getText(R.string.more90)
                    sp!!.getString("all_jobs", "") == "0" -> textView1.visibility = View.GONE
                    else -> textView1.text = sp!!.getString("all_jobs", "")
                }
            } else {
                textView1.visibility = View.GONE
            }

            itemView1.addView(notificationBadgeOne)
        }

结果我看不到任何徽章,因为该项目是null,但它是可见且可点击的。也许我在某个地方犯了一些错误?

更新

我明白我在哪里犯了错误:

if (bottomNavigationView.getChildAt(2) != null) 

此行将始终为空。所以我删除了这个条件,但是我有一个错误:

kotlin.TypeCastException: null cannot be cast to non-null type com.google.android.material.bottomnavigation.BottomNavigationItemView

这条线上的哪些点:

itemView2.addView(notificationBadge2)

据我了解,我致电已删除的项目。但我不知道如何检查项目是否被删除。也许有人知道怎么做?

【问题讨论】:

  • 使用简单代码:BadgeDrawable badge = bottomNavigationView.getOrCreateBadge(menuItemId); badge.setNumber(..); 在您的BottomNavigationView 中添加徽章。
  • 我在这里看到的是可绘制的,为此我使用了特殊的布局

标签: android bottomnavigationview


【解决方案1】:

让事情变得简单...:)

https://developer.android.com/reference/com/google/android/material/bottomnavigation/BottomNavigationView

https://material.io/develop/android/components/badging/

implementation 'com.google.android.material:material:1.2.0-alpha03'

style.xml

<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

你的BottomNavigationView 会是这样的

<com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_navigation"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:menu="@menu/bottom_nav_menu"
            />

活动中

val navBar = findViewById<BottomNavigationView>(R.id.bottom_navigation)
var badge = navBar.getOrCreateBadge(R.id.action_add) //R.id.action_add is menu id
badge.number = 2
badge.backgroundColor = //your color
badge.badgeTextColor = // your textcolor

【讨论】:

  • 数字 2 是在徽章上显示的数字?
  • 我怎样才能为这个徽章添加一些风格?它必须是橙色 :)
  • 如何为此类徽章添加样式?我的代码允许我为徽章添加样式
  • setBackgroundColor(int backgroundColor)
猜你喜欢
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 2017-09-29
  • 1970-01-01
  • 2021-09-17
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多