Har*_*elm 60 android menu android-actionbar
在我的应用程序中,我经常启用/禁用菜单条目,并从onPrepareOptionsMenu中看到它们.
今天我开始将android:showAsAction菜单属性添加到我的一些Android 2.x应用程序中,以显示ActionBar上最常用的菜单条目.
ActionBar不会立即反映启用/禁用和可见性.我需要点击右边的菜单下拉菜单才能看到这种变化.
好的,我知道菜单会在PrepareOptionsMenu上触发.但是我需要做些什么才能刷新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" />
Run Code Online (Sandbox Code Playgroud)
这是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);
}
Run Code Online (Sandbox Code Playgroud)
这是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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果我添加invalidateOptionsMenu这适用于Android 3.x应用程序,但由于缺少方法在Android 2.x设备上崩溃.建议的方法是什么?
wir*_*bly 84
我的选择方法是创建一个帮助器类.例如:
class VersionHelper
{
static void refreshActionBarMenu(Activity activity)
{
activity.invalidateOptionsMenu();
}
}
Run Code Online (Sandbox Code Playgroud)
现在在上面的代码中,替换invalidateOptionsMenu();为:
if (Build.VERSION.SDK_INT >= 11)
{
VersionHelper.refreshActionBarMenu(this);
}
Run Code Online (Sandbox Code Playgroud)
这种方法的功劳归功于CommonsWare(搜索HoneycombHelper,查看他的书籍 - 强烈推荐)
jer*_*bos 67
感谢接受的答案.我正在使用ActionBarActivity.在这个课程中你可以使用
supportInvalidateOptionsMenu();
Run Code Online (Sandbox Code Playgroud)
Uri*_*zev 14
使用
ActivityCompat.invalidateOptionsMenu(Activity activity)
Run Code Online (Sandbox Code Playgroud)
来自兼容性库.
请参阅:https://stackoverflow.com/a/14748687/435855
Kla*_*aak 11
保存对菜单的引用并调用:
this.menu.clear();
this.onCreateOptionsMenu(this.menu);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76031 次 |
| 最近记录: |