1

我正在致力于实现ActionbarCompat的API 7+的应用程序。ActionBarCompat更改项目图标

目前我有一个ActionBar上的“最喜欢的”图标的活动,我试图找到一种方法来切换喜欢和不喜欢之间的图形。

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

有没有人遇到过在运行时更改其中一个ActionBarCompat项目图标的方法,而使用ActionBarCompat可以看到该活动,并仍然与API 11+上的本机ActionBars保持兼容性?

+1

[supportInvalidateOptionsMenu()](http://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportInvalidateOptionsMenu%28%29)看起来在这种情况下可能会有帮助。 – mobinvent 2013-08-10 04:51:34

+0

^这是正确的答案。这种组合并在正确的时间切换图标图形会导致它更新。 – Hamid 2013-08-13 14:02:17

回答

0

您需要实现onCreateOptionsMenu()中的一些基本逻辑,用于检查项目是否受到欢迎,并根据该逻辑更改图标。

在你setFavourite()方法,你将需要:

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

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

这应该迫使ABS重绘。

+1

对不起,但开发人员博客上的那个页面明确指出invalidateOptionsMenu()已在API 11中实现,并且我的问题明确指出我需要它在API 7+上运行。我曾想到这一点,但由于上述原因,显然这是不行的。 – Hamid 2012-07-11 16:05:15

+0

ActionBarSherlock为API级别低于11的实现invalidateOptionsMenu()。试试看。 – Tushar 2012-07-11 17:14:57

+0

ActionBarSherlock不是我担心的选项,但我会查看源代码并查看它们是如何实现的。我在其他地方阅读它只将API等级要求降低到了10. – Hamid 2012-07-12 07:57:17

0

受@ mobinvent评论的启发我发现以下内容为HoneyComb设备提供了ActionBarCompat选项菜单生命周期排序依据HoneyComb及以上版本中的invalidateOptionsMenu()。

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

注意哈希要求打开选项菜单并关闭它。在我特别的例子中,我从onActivityResult调用这个,在这个阶段看起来不会引入任何丑陋的菜单闪烁。

对ActionBar OS/devices之前的好消息!