Android – Как динамически изменять текст пункта меню за пределами 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; } 

Однако я хотел бы иметь возможность изменять заголовок определенного пункта меню за пределами этого метода.

Заранее спасибо за вашу помощь.

Энди

Solutions Collecting From Web of "Android – Как динамически изменять текст пункта меню за пределами onOptionsItemsSelected или onCreateOptionsMenu"

Я хотел бы предложить сохранить ссылку в рамках объекта в объект 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 и обновить имя или значок вашего элемента.