2015-10-13 95 views
3

我已經嘗試過所有可能的解決方案。這裏是我的代碼:MenuItem.setIcon()方法不起作用

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); 
    } 
} 

正如你所看到的,一切都被記錄下來。所以如果某種方法沒有調用,那麼不會有錯誤。我也通過獲取標題來檢查項目。這是正確的項目。只是某種黑魔法。

+1

你在哪裏打電話給changeStar? – Blackbelt

+0

在onLoadFinished方法的UI線程中。它被稱爲,我可以在日誌中檢查它。但圖標不會改變。 –

+0

是否打印日誌? – dex

回答

1

嘗試使用invalidateOptionsMenu並將您的changeStar邏輯移動到onPrepareOptionsMenu。從Android documentation

public boolean onPrepareOptionsMenu (Menu menu) 

在API級別1 準備屏幕的標準選項菜單顯示。在菜單顯示之前,每當顯示菜單時都會調用它。您可以使用此方法高效地啓用/禁用項目或以其他方式動態修改內容。

默認實現基於活動的狀態更新系統菜單項。派生類應始終調用基類實現。

+0

不幸的是它也沒有幫助 –

+0

請顯示您的完整代碼。我也使用工具欄,並使用invalidateOptionsMenu和onPrepareOptionsMenu爲我工作。更新了 – allo86

+1

,請再次檢查完整的問題。 –