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并更新您的项目的名称或图标。