Меню параметров не будет обновляться динамически при использовании ActionBarSherlock - PullRequest
2 голосов
/ 28 октября 2011

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

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

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

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

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

if (mOptionsMenuInvalidated) {

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

1 голос
/ 14 марта 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;

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

...