Android - 如何动态更改onOptionsItemsSelected或onCreateOptionsMenu之外的菜单项文本

Gar*_*bit 202 java android menu menuitem

我正在尝试从onOptionsItemSelected(MenuItem item)方法外部更改菜单项的标题.

我已经做了以下事情;

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;
}
Run Code Online (Sandbox Code Playgroud)

但是我希望能够修改此方法之外的特定菜单项的标题.

Cha*_*ley 370

我建议在活动中保留你在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);
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

或者,您可以覆盖onPrepareOptionsMenu以在每次显示菜单时更新菜单项.


Tod*_*and 109

正如JxDarkAngel建议的那样,从你的Activity中的任何地方调用它,

invalidateOptionsMenu();
Run Code Online (Sandbox Code Playgroud)

然后覆盖:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
  int savedRoute = mPrefs.getInt(getString(R.string.saved_route), 0);
  if (savedRoute > 0) {
    menu.findItem(R.id.action_route).setTitle("Route " + savedRoute);
  }
  return super.onPrepareOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

是一个更好的选择.我使用了/sf/answers/1224755241/的答案


Pra*_*aut 9

你可以这样做创建一个全局的"菜单"对象,然后在onCreateOptionMenu中分配它

public class ExampleActivity extends AppCompatActivity
    Menu menu;
Run Code Online (Sandbox Code Playgroud)

然后分配到这里

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

然后使用指定的Menu对象获取所需的项目

menu.findItem(R.id.bedSwitch).setTitle("Your Text");
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 5

创建一个setOptionsTitle()方法并在类中设置一个字段.如:

String bedStatus = "Set to 'Out of Bed'";
Run Code Online (Sandbox Code Playgroud)

...

public void setOptionsTitle(String status)
{
    bedStatus = status;

}
Run Code Online (Sandbox Code Playgroud)

现在,当填充菜单时,将标题更改为您的状态:

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

        menu.add(bedStatus);


        // Return true so that the menu gets displayed.
        return true;
    }
Run Code Online (Sandbox Code Playgroud)