ActionBar 菜单项的动态可绘制图标? (安卓,ActionBarSherlock)

Posted

技术标签:

【中文标题】ActionBar 菜单项的动态可绘制图标? (安卓,ActionBarSherlock)【英文标题】:dynamic drawable icon for ActionBar menu item? (Android, ActionBarSherlock) 【发布时间】:2012-10-24 21:09:18 【问题描述】:

如何动态更新 ActionBar MenuItem 的图标以显示带有数字的“红色徽章”? (概念上类似于“未读消息计数”)

我在我的 android 应用程序中使用 ActionBarSherlock,目标 API 级别为 10+。我的应用程序用于移动数据捕获,有时用户无法立即提交新数据,但必须将其保存在手机本地(例如,当网络连接不佳时)。

每当手机本地存储“未提交”项目时,我想向用户显示一个菜单项(在操作栏中),以便他们可以单击“未提交项目”活动并手动触发上传。

理想情况下,此菜单项将有一些未提交项目数量的图形表示(类似于电子邮件或短信应用程序如何将未读消息的数量显示为徽章)。目前,我只是在做:

unsubmittedMenuItem.setTitle( Integer.toString(numUnsubmitted) );

这可行,但有两个问题:我更喜欢使用图标并将标题保持为可理解的内容(“未提交”),此外,我希望在这里有一些自定义布局或设计,例如数字后面的红色圆圈背景。

关于如何实现这一点的想法?到目前为止,我的研究提出了两种可能性:

    使用为某些数字范围(例如 1、2、3...10+)预先创建的可绘制级别列表,然后 unsubmittedMenuItem.getIcon().setLevel( numUnsubmitted ) 使用 Bitmap 和 Canvas API 完全动态构建整个位图

这些在我将文本渲染为位图的意义上是相似的(像 #1 那样离线或像 #2 那样在运行中)但是如果利用 ActionBar 的“本机”文本渲染会很棒可能,只需在其后面插入一个红色圆圈,就像在 TextView 中一样。

有没有办法为可绘制的图标设置自定义布局? (不是完整的 actionLayout,只是为了图标?)

【问题讨论】:

【参考方案1】:

有很多方法可以做到这一点:

    使用LayerDrawable 并将徽章图像堆叠在您的图标图像之上。 编写一个从Drawable 扩展的自定义类并手动绘制图标和徽章。 使用自定义操作项视图,您的图标位于ImageView 中,并带有TextView 叠加层作为徽章。

【讨论】:

谢谢杰克(顺便说一句,我非常喜欢你的作品)。让我花一些时间尝试解决 #3 - 关于整个操作栏与特定菜单项的自定义布局的文献相当混乱,但我会更深入地挖掘。 选项#3 绝对是要走的路,实际上很容易,一旦你成功地了解了所有的 Android 概念/抽象。我错误地认为“自定义操作视图”占据了整个操作栏(如经常引用的扩展搜索框示例),但如果您只是执行 wrap_content,您可以很容易地创建自定义“图标”。谢谢! @MikeRepass 我也遇到了类似的问题,请问您能和我们分享一下您的经验吗? @Jake:我曾尝试过选项 3,但这会导致操作栏中的视图在单击时不显示默认背景,而默认背景会在点击 actionItem 时显示。此外,actionItem 的高度和宽度不包括此 customView 的填充。选项 2:我尝试使用我的 CustomDrawable 完成相同的操作,但它显示在 actionItem 的右下角。(但我仍然想使用 CustomDrawable)。您对如何在 actionItem 的中心显示 customDrawable 有任何想法吗?

以上是关于ActionBar 菜单项的动态可绘制图标? (安卓,ActionBarSherlock)的主要内容,如果未能解决你的问题,请参考以下文章

android-ActionBar

如何在 ActionBar 的溢出菜单中显示图标

如何在ActionBar的菜单项图标之间填充使用支持库时

Android - Sherlock ActionBar 长按图标菜单

android ActionBar用法详解

如何在 ActionBar 图标上获取文本?