1

在我的操作栏中,我有 2 个菜单项:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/refresh"
          android:title="Refresh"
          android:icon="@drawable/refresh"
          android:showAsAction="ifRoom" >
    </item>
    <item android:id="@+id/back"
          android:title="Back"
          android:icon="@drawable/back"
          android:showAsAction="ifRoom" >
    </item>
</menu>

我试图将我的菜单项“Refresh”变为“不可见”,当我调用函数 refreshinvisible() 时,Refresh 项消失了,但现在操作栏显示了两个“后退”项……为什么?(我正在使用 SherlockActionBar)

我的 refreshinvisible() 函数:

public void refreshinvisible(){
        MenuItem item = menu.findItem(R.id.refresh);
        item.setVisible(false);
}  

有人知道如何进行吗?

4

2 回答 2

1

你可以阅读这个

在运行时更改菜单项

活动创建后,onCreateOptionsMenu() 方法只被调用一次,如上所述。系统保留并重复使用您在此方法中定义的菜单,直到您的活动被销毁。如果您想在第一次创建选项菜单后随时更改它,您必须重写 onPrepareOptionsMenu() 方法。这会将当前存在的 Menu 对象传递给您。如果您想根据应用程序的当前状态删除、添加、禁用或启用菜单项,这将非常有用。

例如

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
     super.onPrepareOptionsMenu(menu);
     MenuItem item = menu.findItem(R.id.refresh);
     item.setVisible(false);
     return true;
}
于 2013-02-04T18:05:45.890 回答
1

有一个名为onPrepareOptionsMenu()的方法,每次在菜单显示之前调用它,即在调用 onCreateOptionsMenu()之前。您可以使用活动的invalidateOptionsMenu()方法来触发选项菜单的重绘。因此,您可以轻松地在考虑某些条件的情况下重新创建菜单。

这是一些代码。定义两个布尔值作为类的字段,例如:

private boolean showRefresh;
private boolean showBack;

覆盖该onPrepareOptionsMenu()方法并根据相应的设置菜单项的可见性boolean

@Override
public boolean onPrepareOptionsMenu( Menu menu ) {

    super.onPrepareOptionsMenu( menu );

    menu.findItem( R.id.refresh ).setVisible( showRefresh );
    menu.findItem( R.id.back ).setVisible( showBack );

    return true;
}

不,每次您想更改某个菜单项的可见性时,相应地设置相应的boolean并调用该invalidateOptionsMenu()方法。

于 2013-02-04T21:14:46.877 回答