2015-10-13 1 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. Он называется, я могу проверить его в журналах. Но значок не меняется. –

+0

ли журнал печатался? – dex

ответ

1

Попробуйте использовать invalidateOptionsMenu и переместите логику changeStar на номер onPrepareOptionsMenu. От Android documentation:

public boolean onPrepareOptionsMenu (Menu menu) 

Добавлено в уровне API 1 Подготовьте стандартное меню параметров экрана для отображения. Это вызывается прямо перед отображением меню при каждом его показе. Вы можете использовать этот метод для эффективного включения/выключения элементов или, наоборот, динамического изменения содержимого.

Реализация по умолчанию обновляет элементы системного меню в зависимости от состояния активности. Производные классы должны всегда обращаться к реализации базового класса.

+0

К сожалению, это тоже не помогло –

+0

Пожалуйста, покажите свой полный код. Я также работаю с панелями инструментов, и для меня работает invalidateOptionsMenu и onPrepareOptionsMenu. – allo86

+1

обновленный, проверьте полный вопрос повторно пожалуйста. –