【问题标题】:How can i change Menu Item icon programmatically?如何以编程方式更改菜单项图标?
【发布时间】:2019-04-11 10:14:29
【问题描述】:

我需要根据条件更改我的菜单图标,但是当我使用 Menu.getItem(index).setIcon() 时,它根本不会更改我的图标。我需要帮助如何做到这一点

Menu.getItem(index).setIcon()

if (menu != null) {
   if (observedCount != 0)

     menu.getItem(2).setIcon(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_delete_copy));
  else

     menu.getItem(2).setIcon(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_cart));

【问题讨论】:

  • 你的代码是正确的,所以我全力以赴,只有我们才能检查错误在哪里

标签: java android menu icons options


【解决方案1】:

您的代码看起来是正确的,但也许您只在 onCreateOptionsMenu() 中使用过一次,并且错过了将图标更新为 observedCount 更新所需的调用。

方法 1

您可以尝试在活动中执行以下操作:

首先,覆盖onPrepareOptionsMenu() 并在那里应用更改:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (observedCount != 0)
        menu.getItem(2).setIcon(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_delete_copy));
    else
        menu.getItem(2).setIcon(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_cart));

    return super.onPrepareOptionsMenu(menu);
}

然后,每当您希望更新图标时(即,每当observedCount 更改时),只需调用:

invalidateOptionsMenu(); // From a fragment, call activity.invalidateOptionsMenu();

方法2

另一种选择是在onCreateOptionsMenu() 中保存对菜单的引用:

private Menu mMenu;

...

@Override
public void onCreateOptionsMenu(Menu menu)
{
    getMenuInflater().inflate(R.menu.your_menu, menu);
    mMenu = menu;
}

然后,您可以使用该引用来设置图标:

if (observedCount != 0)
    mMenu.getItem(2).setIcon(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_delete_copy));
else
    mMenu.getItem(2).setIcon(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_cart));

希望能做到!

附: 确保在执行menu.getItem(2) 时获得正确的项目(项目编号 2 实际上是第三个,因为计数从 0 开始)。为避免获取错误的项目,最好将要更改的项目设置为 ID,然后将 menu.getItem(2) 替换为 menu.findItem(R.id.your_item_id)

【讨论】:

  • 它没有改变!
  • 或许可以看一下我刚刚在我的消息末尾添加的PS,因为这段代码确实没有理由失败。
猜你喜欢
  • 1970-01-01
  • 2014-03-29
  • 2011-10-31
  • 2019-03-22
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多