Как я могу получить меню опций моей деятельности?

В некоторых методах моей деятельности я хочу проверить заголовок меню или узнать, проверено ли оно или нет. Как я могу получить меню Activity. Мне нужно что-то вроде this.getMenu()


person Bobs    schedule 14.05.2012    source источник
comment
Имя и проверено? Я не понимаю. Идентификатор и предпочтения?   -  person keyser    schedule 14.05.2012
comment
ты про меню опций? Как тот, который создан в общедоступном логическом onCreateOptionsMenu (меню меню)?   -  person MikeIsrael    schedule 14.05.2012
comment
@Keyser: в некоторых случаях меняется название пунктов меню.   -  person Bobs    schedule 14.05.2012


Ответы (5)


Будьте осторожны с invalidateOptionsMenu(). Он воссоздает все меню. Это имеет много накладных расходов и приведет к сбросу встроенных компонентов, таких как SearchView. Мне потребовалось довольно много времени, чтобы выяснить, почему мой SearchView "случайно" закрывается.

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

private Menu mOptionsMenu;

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    mOptionsMenu = menu
    ...
}

private void updateOptionsMenu() {
    if (mOptionsMenu != null) {
        onPrepareOptionsMenu(mOptionsMenu);
    }
}
person Dustin    schedule 19.12.2013
comment
Потрясающий ответ. По какой-то причине я не мог понять, какое меню передать onPrepareOptionsMenu(), так как я хотел изменить его в зависимости от условий, которые происходят только при запуске моей службы и т. д. В любом случае - person James W; 26.02.2014
comment
Я согласен, что накладные расходы слишком велики и очень заметны при использовании invalidateOptionsMenu(). Я бы предпочел, чтобы это решение использовало меньшую рабочую нагрузку. - person Nico Dumdum; 21.10.2014
comment
Используя это, я продолжаю получать null всякий раз, когда экран оценивается. - person levi; 19.11.2014
comment
Если у вас есть объект меню, это лучше, чем это решение - person ; 03.09.2019

Вызовите invalidateOptionsMenu() вместо того, чтобы передавать объект меню.

person Diwakar Bhatia    schedule 08.02.2013
comment
К сожалению, добавлено в уровне API 11 :( - person greg7gkb; 21.06.2013
comment
лучший ответ, с фактическим кодом, т.е.) requireActivity().invalidateOptionsMenu() - person lasec0203; 20.11.2020

вы можете сделать это, передав объект Menu в свой класс Activity

public class MainActivity extends Activity
{
    ...
    ...
    private Menu _menu = null;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        _menu = menu;
        return true;
    }

    private Menu getMenu()
    {
        //use it like this
        return _menu;
    }
}
person Dark    schedule 13.01.2013
comment
Лучше вызывать invalidateOptionsMenu()! и вам просто нужно предоставить свое обновление в методе onPrepareOptionsMenu (меню меню). - person AntoineP; 15.02.2013

Существует несколько методов обратного вызова, которые предоставляют меню в качестве параметра.

Возможно, вы захотите манипулировать им там.

Например:

onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
onCreateOptionsMenu(Menu menu)
onCreatePanelMenu(int featureId, Menu menu)

Есть еще несколько, лучше всего посмотреть документацию по активности и найти нужный метод: http://developer.android.com/reference/android/app/Activity.html

person Ostkontentitan    schedule 14.05.2012
comment
в вашем решении значения не актуальны - person Bobs; 14.05.2012
comment
не знаю точного поведения, но как вы думаете, поможет ли сохранение ссылки в переменной поля? Например: onCreateOptionsMenu (меню меню) { this.menu = меню. . . . и получить к нему доступ, запрашивая название позже? - person Ostkontentitan; 14.05.2012
comment
Я не могу поверить, что нет метода, который просто возвращает объект меню. Например, как мы можем получить контекст, окно, инфлятор макета и многое другое. - person ; 03.09.2019