【问题标题】:ActionBarCompat change item iconActionBarCompat 更改项目图标
【发布时间】:2012-07-11 15:44:31
【问题描述】:

我正在开发一个实现 ActionbarCompat 的 API 7+ 应用程序。

目前我在 ActionBar 上有一个带有“收藏夹”图标的活动,我正在尝试找到一种在收藏夹和不收藏夹之间切换图形的方法。

我在 onCreateOptionsMenu、onPrepareOptionsMenu 和 onOptionsItemSelected 中的所有努力都失败了,看来图标只能在创建时更改,而不能在 Activity 已经运行时更改。

有没有人想办法在运行时更改其中一个 ActionBarCompat 项目图标,同时使用 ActionBarCompat 可见活动,并且仍然保持与 API 11+ 上的本机 ActionBar 的兼容性?

【问题讨论】:

  • supportInvalidateOptionsMenu() 在这种情况下看起来可能会有所帮助。
  • ^ 这是正确答案。这与在正确时间切换图标图形相结合会导致它更新。

标签: android android-actionbar compatibility android-actionbar-compat


【解决方案1】:

您需要在onCreateOptionsMenu() 中实现一些基本逻辑,以检查该项目是否被收藏并根据该逻辑更改图标。

在您的 setFavourite() 方法中,您需要:

setFavourite() {
    ....
    if (changedFavourite)
       invalidateOptionsMenu()

在此处查看文档:http://developer.android.com/reference/android/app/Activity.html#invalidateOptionsMenu()

这应该会强制 ABS 重绘。

【讨论】:

  • 抱歉,开发者博客上的那个页面明确指出 invalidateOptionsMenu() 是在 API 11 中实现的,我的问题明确指出我需要它在 API 7+ 上运行。我已经想到了这一点,但由于上述原因,这显然是不行的。
  • ActionBarSherlock 为低于 11 的 API 级别实现了 invalidateOptionsMenu()。试试看吧。
  • ActionBarSherlock 恐怕不是一个选项,但我会看看源代码,看看他们是如何实现它的。我在其他地方读到它只将 API 级别要求降低到 10。
  • 啊,对不起。将 ActionBarCompat 读作 ActionBarSherlock。 ABS很棒,我强烈推荐它。它实现了早在 2.x 的所有内容(所以我相信 API 级别 7),并且与标准操作栏中的所有方法具有 1:1 的兼容性。
  • 恐怕因为它是一种商业产品,由于各种原因,我的使用受到限制,因此不能选择 ABS。
【解决方案2】:

受@mobinvent 评论的启发,我发现以下内容为使用 ActionBarCompat 的预 HoneyComb 设备提供了按照 HoneyComb 及更高版本上的 invalidateOptionsMenu() 的选项菜单生命周期排序。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) invalidateOptionsMenu();
else {
    supportInvalidateOptionsMenu();
    openOptionsMenu();
    closeOptionsMenu();
}

请注意打开选项菜单并关闭它的 hacky 要求。在我的特定实例中,我从 onActivityResult 调用它,在这个阶段似乎没有引入任何难看的菜单闪烁。

远离 ActionBar 操作系统/设备!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多