Я пытаюсь изменить название элемента меню за пределами метода 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; }
Однако я хотел бы иметь возможность изменять заголовок определенного пункта меню за пределами этого метода.
Заранее спасибо за вашу помощь.
Энди
Я хотел бы предложить сохранить ссылку в рамках объекта в объект Menu, который вы получаете в onCreateOptionsMenu, а затем использовать его для извлечения 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, называя это из любой точки вашей деятельности ,
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); }
Это гораздо лучший выбор. Я использовал ответ из https://stackoverflow.com/a/17496503/568197
Создайте метод 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>
Вы можете сделать это, создайте глобальный объект «Меню», а затем назначьте его в 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");
Мне кажется, что вы хотите изменить содержимое меню внутри локального метода, и этот метод вызывается в любое время, всякий раз, когда происходит событие, или в потоке пользовательского интерфейса активности.
Почему бы вам не взять экземпляр меню в глобальной переменной в onPrepareOptionsMenu, если это переопределено и использовать в этом методе. Убедитесь, что этот метод вызывается всякий раз, когда происходит событие (например, нажатие кнопки) или в потоке пользовательского интерфейса активности, обработчике или асинхронной задаче после выполнения.
Вы должны заранее знать индекс этого пункта меню, который хотите изменить. После очистки меню вам необходимо раздуть меню XML и обновить имя или значок вашего элемента.