1

Я работаю над приложением для API 7+, которое реализует ActionbarCompat.ActionBarCompat change item icon

В настоящее время у меня есть активность с «любимым» значком на ActionBar, и я пытаюсь найти способ переключить графику между любимым и не любимым.

Все мои попытки игры в onCreateOptionsMenu, onPrepareOptionsMenu и onOptionsItemSelected потерпели неудачу, похоже, что значок может быть изменен только во время создания, а не пока активность уже запущена.

Есть ли у кого-нибудь возможность изменить один из этих значков элементов ActionBarCompat во время выполнения, пока активность видна с помощью ActionBarCompat и по-прежнему поддерживает совместимость с родными ActionBars на API 11+?

+1

[supportInvalidateOptionsMenu()] (http://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportInvalidateOptionsMenu%28%29) похоже, что это может помочь в этом случае. – mobinvent

+0

^Это правильный ответ. Комбинация этого и изменение графика значков в правильное время заставляет его обновлять. – Hamid

ответ

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

+0

ActionBarSherlock реализует invalidateOptionsMenu() для уровней API ниже 11. Попробуйте и посмотрите. – Tushar

+0

ActionBarSherlock - это не вариант. Боюсь, но я посмотрю источник и посмотрю, как они его реализуют. Я читал в другом месте, он только вытащил требование уровня API до 10. – Hamid

0

Вдохновленный комментарием @ mobinvent, я обнаружил, что следующее дает устройствам предварительной HoneyComb, использующим ActionBarCompat секвенцию жизненного цикла меню опций в соответствии с invalidateOptionsMenu() на HoneyComb и выше.

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

Обратите внимание на требование взлома, чтобы открыть меню параметров и закрыть его. В моем конкретном случае я называю это от onActivityResult, который на этом этапе, похоже, не представляет какого-либо уродливого флекера меню.

Хорошее избавление от предустановленной ОС/устройств!