在我的应用程序中,我经常启用/禁用菜单项,并使它们在onPrepareOptionsMenu中可见。
今天,我开始在我的一些Android2.x应用中添加android:showAsAction菜单属性,以显示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,它可以在Android3.x应用程序上运行,但在Android2.x设备上会因为缺少方法而崩溃。推荐的正确方法是什么?
发布于 2011-10-19 06:43:17
我选择的方法是创建一个助手类。例如:
class VersionHelper
{
static void refreshActionBarMenu(Activity activity)
{
activity.invalidateOptionsMenu();
}
}
现在,在上面的代码中,将invalidateOptionsMenu();
替换为:
if (Build.VERSION.SDK_INT >= 11)
{
VersionHelper.refreshActionBarMenu(this);
}
这种方法的功劳归功于CommonsWare (搜索HoneycombHelper,并查看他的书籍-强烈推荐)
发布于 2013-10-29 12:48:54
多亏了公认的答案。我正在使用ActionBarActivity。在这个类中,您可以使用
supportInvalidateOptionsMenu();
发布于 2013-10-17 18:14:22
使用
ActivityCompat.invalidateOptionsMenu(Activity activity)
https://stackoverflow.com/questions/7765184
复制相似问题