MenuItem.setIcon()方法不起作用

时间:2015-10-13 16:28:06

标签: android menu icons menuitem

我已经尝试过所有可能的解决方案。这是我的代码:

private Menu mMenu;

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_article_detail_menu, menu);
    mMenu = menu;
}

void changeStar(boolean added) {
    if (mMenu != null) {
        MenuItem item = mMenu.findItem(R.id.favourites_item);
        if (added) {
            Log.d(LOG_TAG, "Set full icon");
            item.setIcon(getResources().getDrawable(R.drawable.star_full));
        } else {
            Log.d(LOG_TAG, "Set empty icon");
            item.setIcon(getResources().getDrawable(R.drawable.star_empty));
        }
    }
}

这是我的菜单xml文件:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="ssidit.pp.ua.payspacereader.ArticleDetailActivity">
    <item
        android:id="@+id/refresh_item"
        android:title="@string/refresh"
        app:showAsAction="never"></item>

    <item
        android:id="@+id/favourites_item"
        android:icon="@drawable/star_empty"
        android:title="@string/add_to_favourite"
        app:showAsAction="ifRoom"></item>

    <item
        android:id="@+id/share_item"
        android:icon="@drawable/ic_share"
        android:title="@string/share"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
        app:showAsAction="ifRoom"></item>
</menu>

invalidateMenu()方法没有帮助。当我调用setIcon方法时,我的Android设备上没有任何变化。

这是我的代码:

private boolean isFavourite;

 private void setValues(Cursor cursor) {

    Log.d(LOG_TAG, "Setting values");

    setData(titleTextView, CursorUtility.getTitle(cursor));
    setData(dateTextView, CursorUtility.getDateText(cursor));
    setData(timeTextView, CursorUtility.getTimeText(cursor));
    isFavourite = CursorUtility.isFavourite(cursor);
    getActivity().invalidateOptionsMenu();
}


@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    Log.d(LOG_TAG, "OnPrepareOptionsMenu");
    MenuItem item = menu.findItem(R.id.favourites_item);
    if (isFavourite) {
        Log.d(LOG_TAG, "Set full icon");
        item.setIcon(R.drawable.star_full);
    } else {
        Log.d(LOG_TAG, "Set empty icon");
        item.setIcon(R.drawable.star_empty);
    }
}

如您所见,一切都被记录下来。因此,如果某些方法不调用则不会出错。我也通过获得它的标题来检查项目。这是正确的项目。只是某种黑魔法。

2 个答案:

答案 0 :(得分:1)

尝试使用invalidateOptionsMenu并将changeStar逻辑移至onPrepareOptionsMenu。来自Android documentation

public boolean onPrepareOptionsMenu (Menu menu)
  

在API级别1中添加   准备要显示的屏幕标准选项菜单。每次显示菜单时都会调用此菜单。您可以使用此方法有效地启用/禁用项目或以其他方式动态修改内容。

     

默认实现根据活动的状态更新系统菜单项。派生类应始终调用基类实现。

答案 1 :(得分:1)

首先:设置菜单的全局变量

第二:在活动中要更改图标的任何地方,只需使用getItem()方法而不是findItem通过全局变量菜单获取该菜单项。

第三步:将图标设置为menuItem返回的getItem(),如下所示menuItem.setIcon(res)