Удалить значок из BottomNavigation

Я реализовал значок счетчика в соответствии с следующим потоком.

Затем я немного потратился, чтобы удалить значок из элемента навигации, когда счетчик уведомлений равен 0:

fun setInboxIcon(count: Int) {
    val bottomNavigationMenuView = bottomNavigation.getChildAt(0) as BottomNavigationMenuView
    val bottomNavigationItemView = bottomNavigationMenuView.getChildAt(3) as BottomNavigationItemView
    val inboxBadge = LayoutInflater.from(context).inflate(R.layout.inbox_icon_layout, bottomNavigationMenuView, false)
    notificationCount = inboxBadge.findViewById(R.id.notification_count)

    if (count == 0) {
        notificationCount.visibility = GONE
        notificationCount.text = ""
        bottomNavigationItemView.removeView(inboxBadge) // <- nothing happens
    } else {
        notificationCount.visibility = VISIBLE
        notificationCount.text = Math.min(count, 9).toString()
        bottomNavigationItemView.addView(inboxBadge)
    }

    bottomNavigation.invalidate()
}

Проблема в том, что значок не удаляется, когда счетчик уведомлений равен 0, и я не могу понять, почему.


person Ambran    schedule 25.01.2018    source источник
comment
В чем проблема? очевидно, вы должны сделать что-то противоположное bottomNavigationItemView.addView(inboxBadge); ... и какой смысл раздувать представление, если count равен 0?   -  person Selvin    schedule 25.01.2018
comment
afterr edit: теперь вы удаляете недавно надутый элемент... которого, очевидно, не существует внутри bottomNavigationItemView... так что, очевидно, ничего не происходит...   -  person Selvin    schedule 25.01.2018
comment
Очевидное решение: 1. создать inboxBadge только один раз 2. сохранить ссылки на него 3. использовать setVisibility   -  person Selvin    schedule 25.01.2018
comment
@Selvin Я также пытался объявить значок глобально (который должен указывать на один и тот же экземпляр) и ссылаться на него при удалении. Тоже не помогает.   -  person Ambran    schedule 25.01.2018
comment
Люди, пожалуйста, имейте приличие объяснить свои отрицательные голоса вместо того, чтобы просто отрицать совершенно законный вопрос.   -  person Ambran    schedule 25.01.2018
comment
У него ДЕЙСТВИТЕЛЬНО есть проблема. почему минусование? в строке notificationCount.setVisibility(GONE); он устанавливает видимость нового экземпляра notificationCount. см. его ответ, где он удаляет ранее созданный экземпляр View!   -  person Hesham Yassin    schedule 03.08.2018


Ответы (2)


Нашел решение.

Я нахожу настоящий значок в пункте меню и удаляю его, прежде чем создать новый. Это единственный подход, который работает для меня:

fun setInboxIcon(count: Int) {
    val bottomNavigationMenuView = bottomNavigation.getChildAt(0) as BottomNavigationMenuView
    val bottomNavigationItemView = bottomNavigationMenuView.getChildAt(3) as BottomNavigationItemView
    val badge = LayoutInflater.from(context).inflate(R.layout.inbox_icon_layout, bottomNavigationMenuView, false)
    val notificationCount = badge.findViewById(R.id.notification_count)

    // Reset current badge
    bottomNavigationItemView.removeView(bottomNavigationItemView.getChildAt(2))

    // Add new badge
    if (count > 0) {
        notificationCount.text = Math.min(count, 9).toString()
        bottomNavigationItemView.addView(badge)
    }
}
person Ambran    schedule 26.01.2018

В моем случае я добавил TAG в badgeView и нашел представление по TAG, чтобы удалить его.

private val TAG = "Badge"

fun addOrRemoveBadgeView(bottomNav: BottomNavigationView, show: Boolean) {
    val menuView = bottomNav.getChildAt(0) as BottomNavigationMenuView
    val itemView = menuView.getChildAt(3) as BottomNavigationItemView
    val notificationsBadge = LayoutInflater.from(bottomNav.context)
                                .inflate(R.layout.badge_layout,menuView, false)
    notificationsBadge.tag = TAG

    if (show) {
        itemView.addView(notificationsBadge)
    }
    else {
        val view = itemView.findViewWithTag<View>(TAG)
        itemView.removeView(view)
    }
}
person Thwe    schedule 15.06.2021