【发布时间】:2011-12-07 14:07:26
【问题描述】:
在我的应用程序中,我经常启用/禁用菜单条目,并让它们在 onPrepareOptionsMenu 中可见。
今天我开始将 android:showAsAction 菜单属性添加到我的一些 Android 2.x 应用程序中,以在 ActionBar 上显示最常用的菜单条目。
ActionBar 不会立即反映启用/禁用和可见性。我需要点击右侧的下拉菜单才能看到这种变化。
好的,我知道菜单会触发 onPrepareOptionsMenu。但是我需要做什么来刷新 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" />
这是 onPrepareOptionsMenu:
@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 设备上崩溃。推荐的正确方法是什么?
【问题讨论】:
标签: android menu android-actionbar