Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

Как предложил 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);
}

- намного лучший выбор. Я использовал ответ fooobar.com/questions/41629/...

Ответ 3

вы можете сделать это, создайте глобальный объект "Меню", а затем назначьте его в 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");

Ответ 4

Создайте метод 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;
    }

Ответ 5

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

Здесь пример

Ответ 6

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

BottomNavigationView navigation = this.findViewById(R.id.my_bottom_navigation);
Menu menu = navigation.getMenu();
menu.findItem(R.id.nav_wall_see).setTitle("Hello");

Ответ 7

Объявите свое поле меню.

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*/);
}

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

Ответ 8

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

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

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

Ответ 9

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

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

Options Menu Title Text

Ответ 10

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

private Menu top_menu;

//...

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