Android - Как динамически изменять текст пункта меню вне onOptionsItemsSelected или onCreateOptionsMenu - PullRequest
192 голосов
/ 15 августа 2011

Я пытаюсь изменить заголовок пункта меню вне метода 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;
}

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

Ответы [ 10 ]

361 голосов
/ 15 августа 2011

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

102 голосов
/ 18 августа 2015

Как и предполагал 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

7 голосов
/ 27 июня 2017

Вы можете сделать это, создать глобальный объект «Меню», затем назначить его в 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");
5 голосов
/ 15 августа 2011

Создайте метод 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;
    }
3 голосов
/ 30 июля 2018

Я использую этот код для оценки моего нижнего элемента навигации

BottomNavigationView navigation = this.findViewById(R.id.my_bottom_navigation);
Menu menu = navigation.getMenu();
menu.findItem(R.id.nav_wall_see).setTitle("Hello");
3 голосов
/ 31 мая 2013

Вам лучше использовать переопределение 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");
   }

Здесь пример

2 голосов
/ 15 февраля 2018

Объявление вашего поля меню.

private Menu menu;

Ниже приведен метод onCreateOptionsMenu ()

public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
    try {
        getMenuInflater().inflate(R.menu.menu_main,menu);
    } catch (Exception e) {
        e.printStackTrace();
        Log.i(TAG, "onCreateOptionsMenu: error: "+e.getMessage());
    }
    return super.onCreateOptionsMenu(menu);
}

Ниже будет указано ваше имя. Либо нажатием кнопки, либо условным кодом

public void setMenuName(){
menu.findItem(R.id.menuItemId).setTitle(/*Set your desired menu title here*/);
}

Это сработало для меня.

0 голосов
/ 02 мая 2019

Мне нужно было изменить значок меню для фрагмента. Я немного изменил ответ Чарльза на этот вопрос для фрагмента:

    private Menu top_menu;

    //...
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

       setHasOptionsMenu(true);
       //...
       rootview = inflater.inflate(R.layout.first_content,null);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.fragment_menu, menu);
        this.top_menu = menu;
    }


    // my procedure
    private void updateIconMenu() {
         if(top_menu!= null) {
             MenuItem nav_undo = top_menu.findItem(R.id.action_undo);
             nav_undo.setIcon( R.drawable.back);
         }
    }
0 голосов
/ 08 мая 2015

Для людей, которым нужен статический заголовок. Это можно сделать в AndroidManifest.xml

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

Options Menu Title Text

0 голосов
/ 20 ноября 2013

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

Почему бы вам не взять экземпляр Menu в глобальной переменной в onPrepareOptionsMenu, если это переопределено, и использовать в своем методе. Убедитесь, что этот метод вызывается всякий раз, когда происходит событие (например, нажатие кнопки), или в потоке пользовательского интерфейса, обработчике или асинхронной задаче после выполнения.

Вы должны заранее знать индекс этого пункта меню, который вы хотите изменить. После очистки меню вам нужно накачать меню XML и обновить имя или значок вашего элемента.

...