Как я могу обновить ActionBar, когда onPrepareOptionsMenu переключил пункты меню?

В моих приложениях я часто включаю / отключаю пункты меню и делаю их видимыми из onPrepareOptionsMenu.

Сегодня я начал добавлять атрибут меню android: showAsAction в некоторые из моих приложений для Android 2.x, чтобы отображать элементы меню, наиболее часто используемые в ActionBar.

Панель действий не отражает включение / отключение и видимость сразу. Мне нужно нажать на выпадающее меню справа, чтобы увидеть это изменение.

Хорошо, я понимаю, что меню запускается по RepareOptionsMenu. Но что мне нужно сделать, чтобы обновить ActionBar? Я думаю, что это изменение должно быть применено изнутри onOptionsItemSelected, но я не знаю, что мне следует называть.

Вот меню:

<item
    android:icon="@drawable/ic_menu_mapmode"
    android:id="@+id/men_mapview"
    android:showAsAction="ifRoom|withText"
    android:title="@string/txt_mapview" />

<item
    android:icon="@drawable/ic_menu_mapmode"
    android:id="@+id/men_satelliteview"
    android:showAsAction="ifRoom|withText"
    android:title="@string/txt_satelliteview" />

Вот меню onPrepareOptions:

@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
    MenuItem menuItemMapView = menu.findItem(R.id.men_mapview);
    MenuItem menuItemSatelliteView = menu.findItem(R.id.men_satelliteview);

    if (mapView.isSatellite()) {
        menuItemMapView.setEnabled(true).setVisible(true);
        menuItemmenuItemSatelliteView.setEnabled(false).setVisible(false);
    } else {
        menuItemMapView.setEnabled(false).setVisible(false);
        menuItemmenuItemSatelliteView.setEnabled(true).setVisible(true);
    }

    return super.onPrepareOptionsMenu(menu);
}

Вот onOptionsItemSelected

@Override
public boolean onOptionsItemSelected(final MenuItem menuItem) {
    switch (menuItem.getItemId()) {
        case R.id.men_mapview:
            mapView.setSatellite(false);
            mapView.setStreetView(true);
            mapView.invalidate();

            invalidateOptionsMenu(); // This works on Android 3.x devices only
            return true;
        case R.id.men_satelliteview:
            mapView.setSatellite(true);
            mapView.setStreetView(false);
            mapView.invalidate();

            invalidateOptionsMenu(); // This works on Android 3.x devices only
            return true;
    }

    return super.onOptionsItemSelected(menuItem);
}

РЕДАКТИРОВАТЬ: Если я добавлю invalidateOptionsMenu, это работает в приложениях Android 3.x, но происходит сбой на устройствах Android 2.x из-за отсутствующего метода. Какой рекомендуемый способ сделать это правильно?

Ответы на вопрос(10)

Ваш ответ на вопрос