我试图从onOptionsItemSelected(MenuItem项目)方法之外更改菜单项的标题。

我已经做了以下工作;

public boolean onOptionsItemSelected(MenuItem item) {
  try {
    switch(item.getItemId()) {
      case R.id.bedSwitch:
        if(item.getTitle().equals("Set to 'In bed'")) {
          item.setTitle("Set to 'Out of bed'");
          inBed = false;
        } else {
          item.setTitle("Set to 'In bed'");
          inBed = true;
        }
        break;
    }
  } catch(Exception e) {
    Log.i("Sleep Recorder", e.toString());
  }
  return true;
}

但是,我希望能够修改这个方法之外的特定菜单项的标题。


当前回答

我建议在活动中保持对您在onCreateOptionsMenu中接收的Menu对象的引用,然后使用它来检索需要更改的MenuItem,当您需要它时。例如,你可以这样做:

public class YourActivity extends Activity {

  private Menu menu;
  private String inBedMenuTitle = "Set to 'In bed'";
  private String outOfBedMenuTitle = "Set to 'Out of bed'";
  private boolean inBed = false;

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    // Create your menu...

    this.menu = menu;
    return true;
  }

  private void updateMenuTitles() {
    MenuItem bedMenuItem = menu.findItem(R.id.bedSwitch);
    if (inBed) {
      bedMenuItem.setTitle(outOfBedMenuTitle);
    } else {
      bedMenuItem.setTitle(inBedMenuTitle);
    }
  }

}

或者,您可以覆盖onprepareoptionmenu来更新每次菜单显示的菜单项。

其他回答

你最好使用重写onprepareoptionmenu

menu.Clear ();
   if (TabActual == TabSelec.Anuncio)
   {
       menu.Add(10, 11, 0, "Crear anuncio");
       menu.Add(10, 12, 1, "Modificar anuncio");
       menu.Add(10, 13, 2, "Eliminar anuncio");
       menu.Add(10, 14, 3, "Actualizar");
   }
   if (TabActual == TabSelec.Fotos)
   {
       menu.Add(20, 21, 0, "Subir foto");
       menu.Add(20, 22, 1, "Actualizar");
   }
   if (TabActual == TabSelec.Comentarios)
   {
       menu.Add(30, 31, 0, "Actualizar");
   }

这里有一个例子

我建议在活动中保持对您在onCreateOptionsMenu中接收的Menu对象的引用,然后使用它来检索需要更改的MenuItem,当您需要它时。例如,你可以这样做:

public class YourActivity extends Activity {

  private Menu menu;
  private String inBedMenuTitle = "Set to 'In bed'";
  private String outOfBedMenuTitle = "Set to 'Out of bed'";
  private boolean inBed = false;

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    // Create your menu...

    this.menu = menu;
    return true;
  }

  private void updateMenuTitles() {
    MenuItem bedMenuItem = menu.findItem(R.id.bedSwitch);
    if (inBed) {
      bedMenuItem.setTitle(outOfBedMenuTitle);
    } else {
      bedMenuItem.setTitle(inBedMenuTitle);
    }
  }

}

或者,您可以覆盖onprepareoptionmenu来更新每次菜单显示的菜单项。

你可以创建一个全局的“Menu”对象,然后在onCreateOptionMenu中分配它

public class ExampleActivity extends AppCompatActivity
    Menu menu;

然后在这里赋值

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    this.menu = menu;
    return true;
}

然后使用赋值的Menu对象获取所需的项

menu.findItem(R.id.bedSwitch).setTitle("Your Text");

在我看来,你想要在一个本地方法内更改菜单的内容,这个方法随时被调用,无论何时发生事件,或在活动UI线程。

你为什么不采取菜单的实例在onprepareoptionmenu的全局变量时,这是覆盖和使用你的方法。确保在事件发生时(如按钮单击),或在活动UI线程,处理程序或异步任务后执行时调用此方法。

您应该事先知道要更改的菜单项的索引。清除菜单后,您需要扩展菜单XML并更新项目的名称或图标。

正如JxDarkAngel所建议的,从您的活动中的任何地方调用这个,

invalidateOptionsMenu();

然后重写:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
  MenuItem item = menu.findItem(R.id.bedSwitch);
    if (item.getTitle().equals("Set to 'In bed'")) {
        item.setTitle("Set to 'Out of bed'");
        inBed = false;
    } else {
        item.setTitle("Set to 'In bed'");
        inBed = true;
    }
  return super.onPrepareOptionsMenu(menu);
}

是一个更好的选择。我使用了https://stackoverflow.com/a/17496503/568197上的答案