首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ToolBar MenuItem中BadgeDrawable的LiveData更新

ToolBar MenuItem中BadgeDrawable的LiveData更新
EN

Stack Overflow用户
提问于 2021-01-06 22:13:15
回答 1查看 515关注 0票数 3

我想在工具栏操作上显示一个徽章。徽章编号由LiveData值更新。

这就是我贴徽章的方式:

代码语言:javascript
复制
BadgeUtils.attachBadgeDrawable(inboxBadgeDrawable, toolbar, R.id.menu_inbox);

我尝试了不同的地方,包括Activity.onCreateOptionsMenu()Activity.onPrepareOptionsMenu()androidx.lifgecycle.Observer.onChanged()

当有任何更改(工具栏或徽章内容)时,徽章会被放错位置,向左移动。或者将其复制到另一个操作。

我猜attachBadgeDrawable试图在工具栏中找到R.id.menu_inbox的容器视图,插入徽章并更新它的偏移量。如果菜单项的容器视图发生更改,旧的容器视图仍然具有旧的徽章,并且没有(合理的)方法将其移除。此外,偏移量的应用似乎是堆叠的。

那么,在工具栏操作图标上使用BadgeDrawable有什么其他的方式吗?

我知道这个功能还处于实验阶段。这个问题会得到解决吗?如果会,大约需要多长时间?(我现在使用com.google.android.material:material:1.3.0-beta01。)

这个问题主要是针对组件的开发人员的,因为根据https://github.com/material-components/material-components-android的说法,应该在这里询问使用问题。

编辑:我还在项目的跟踪器上创建了一个问题(功能请求):https://github.com/material-components/material-components-android/issues/1967

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-26 21:00:46

我不确定这是一个正式的解决方案,但这仍然是一个变通办法。我最终在每个onPrepareOptionsMenu上都分离了BadgeDrawable,以防菜单项被更改或重新排列

代码语言:javascript
复制
// This is an indicator of whether we need to show the badge or not
private var isFilterOn: Boolean = false

private var filterBadge: BadgeDrawable? = null

@SuppressLint("UnsafeExperimentalUsageError")
override fun onPrepareOptionsMenu(menu: Menu) {
    super.onPrepareOptionsMenu(menu)

    val filterItem = menu.findItem(R.id.action_filter)
    val toolbar = requireActivity().findViewById<Toolbar>(R.id.toolbar)

    if(filterBadge != null) {
        BadgeUtils.detachBadgeDrawable(filterBadge!!, toolbar, R.id.action_filter)
        filterBadge = null
    }

    if(isFilterOn) {
        filterBadge = BadgeDrawable.create(requireContext()).also {
            BadgeUtils.attachBadgeDrawable(it, toolbar, R.id.action_filter)
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65597372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档