ToolBar MenuItem 中 BadgeDrawable 的 LiveData 更新
LiveData update of BadgeDrawable in ToolBar MenuItem
我想在工具栏操作上显示徽章。徽章编号由 LiveData
值更新。
这是我附上徽章的方式:
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
我不确定这是官方解决方案,但这仍然是一种解决方法。我最终在每个 onPrepareOptionsMenu
上分离了 BadgeDrawable
,以防菜单项被更改或重新排列
// 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)
}
}
}
我想在工具栏操作上显示徽章。徽章编号由 LiveData
值更新。
这是我附上徽章的方式:
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
我不确定这是官方解决方案,但这仍然是一种解决方法。我最终在每个 onPrepareOptionsMenu
上分离了 BadgeDrawable
,以防菜单项被更改或重新排列
// 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)
}
}
}