Меню параметров не будет обновляться динамически при использовании ActionBarSherlock

Что мне нужно: создать меню параметров с опцией «Войти», когда пользователь входит в систему, он должен измениться на «Выйти», когда пользователь снова нажимает кнопку меню.

При использовании чистого SDK я могу просто изменить параметры меню в onPrepareOptionsMenu, то же самое работает при использовании библиотеки совместимости v4, однако при использовании ActionBarSherlock меню не будет обновляться в onPrepareOptionsMenu; он по-прежнему вызывается, но отображаемое меню не меняется.

У кого-нибудь есть решение?


person Denis    schedule 28.10.2011    source источник


Ответы (2)


Да, это неприятная ошибка в ABS. Вы можете исправить это следующим образом: в FragmentActivity.java найдите метод onPrepareOptionsMenu(android.view.Menu menu) и закомментируйте или удалите

if (mOptionsMenuInvalidated) {

строку и соответствующую закрывающую скобку, поэтому этот блок выполняется каждый раз. Сделайте то же самое в действии FragmentMapActivity, если вы его используете.

person Evgeny F    schedule 11.11.2011
comment
Кажется, это исправлено в ABS 4. Не забудьте вызвать invalidateOptionsMenu() в вашем onTabSelected(), чтобы сообщить системе о запуске onPrepareOptionsMenu(). - person larham1; 19.07.2012
comment
Поскольку это старый вопрос, я собираюсь пойти с предложением @larham1 и предположить, что оно исправлено. - person Denis; 09.07.2013

Этот поток немного устарел, и я не смог применить предложенное исправление (или найти лучшее). Я использую ActionBarSherlock 4.2, но у меня все еще есть проблема при входе в систему на устройствах ICS, где меню параметров является наложением: я не мог понять, как принудительно аннулировать меню только ПОСЛЕ закрытия действия входа (и приложение определил, что подписанное состояние изменилось).

Я решил проблему с флагом, чтобы сделать меню недействительным onResume. Я чувствую, что использование флага — это хак, но это лучше, чем аннулирование каждого резюме.

@Override
protected void onResume()
{
    if ( checkLoginState == Boolean.TRUE )
    {
        invalidateOptionsMenu();
        checkLoginState = Boolean.FALSE;
    }
    super.onResume();
}

Затем в onOptionsItemSelected я устанавливаю флаг:

@Override
public boolean onOptionsItemSelected( MenuItem item )
{
    // Handle item selection
    switch ( item.getItemId() )
    {
        case R.id.actionbar_settings_signin_out:
            if (isUserLoggedIn() == Boolean.TRUE )
            {
                logout();
                validateOptionsMenu();
            }
            else
            {
                // set the flag so that on resume we update the options menu
                checkLoginState = Boolean.TRUE;
                startSignInActivity();
            }
            return true;

Это работает для меня, но мне любопытно услышать, решили ли другие это лучше.

person mjancola    schedule 14.03.2013