Android的 – 如何dynamic更改菜单项文字onOptionsItemsSelected或onCreateOptionsMenu之外

我试图改变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; } 

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

我build议在活动中保留一个对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); } } } 

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

正如JxDarkAngel所build议的,从您的活动中的任何地方调用此函数,

 invalidateOptionsMenu(); 

然后重写:

 @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); } 

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

创build一个setOptionsTitle()方法并在你的类中设置一个字段。 如:

 String bedStatus = "Set to 'Out of Bed'"; 

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

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

 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(bedStatus); // Return true so that the menu gets displayed. return true; } 

你最好使用覆盖onPrepareOptionsMenu

 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"); } 

这里是一个例子

对于需要静态标题设置的人 这可以在AndroidManifest.xml中完成

 <activity android:name=".ActivityName" android:label="Title Text" > </activity> 

选项菜单标题文本

你可以这样做,创build一个全局的“菜单”对象,然后在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.findItem(R.id.bedSwitch).setTitle("Your Text"); 

在我看来,你想在本地方法内改变菜单的内容,并且无论何时发生事件,或者在活动UI线程中,都会随时调用此方法。

为什么不用onPrepareOptionsMenu中的全局variables中的Menu实例,当这被覆盖并用于你的这个方法。 确保每当发生事件(如button单击)时,或在活动UI线程,处理程序或asynchronous任务后执行中调用此方法。

您应该提前知道您想要更改的菜单项的索引。 清除菜单后,您需要充气菜单XML并更新您的项目的名称或图标。