Как я могу заставить метод onPrepareOptionsMenu срабатывать?

В методе onCreateOptionsMenu моей активности я просто увеличиваю файл макета меню и прикрепляю его.

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

Мой метод onPrepareOptionsMenu не всегда срабатывает. Я не знаю почему, но он не всегда срабатывает, когда я нажимаю кнопку «Меню» на своем телефоне. Возможно, это как-то связано с его внутренним состоянием.

Кажется, он срабатывает, когда создается Activity. Нажатие кнопки «Меню» в первый раз не приводит к срабатыванию, но если я нажимаю кнопку меню во второй раз, все работает нормально.

Есть ли способ заставить onPrepareOptionsMenu стрелять.

Спасибо


Смок предложил использовать метод invalidateOptionsMenu для аннулирования элементов меню, но это также приводит к срабатыванию метода onCreateOptionsMenu. Вот мой метод:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    System.out.println("onCreate");

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.search, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconified(false);
    searchView.requestFocusFromTouch();

    return true;

}

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
    System.out.println("prepared");

    if (this.objAdapter == null) {
        menu.findItem(R.id.sort).setVisible(false);
        menu.findItem(R.id.filter).setVisible(false);
        menu.findItem(R.id.group).setVisible(false);
    } else {
        menu.findItem(R.id.sort).setVisible(true);
        menu.findItem(R.id.filter).setVisible(true);
        menu.findItem(R.id.group).setVisible(true);

    }

    return true;
}

Как вы можете видеть из моего метода onCreateOptionsMenu, его повторный вызов приведет к потере фокуса на SearchView.


person Mridang Agarwalla    schedule 13.09.2012    source источник
comment
Вы используете ActionBar? Проверьте этот ответ   -  person smok    schedule 13.09.2012
comment
Привет, Смок, я уже пробовал это, и это сработало, но вызвало дополнительные сложности. Это также приводит к срабатыванию моего метода onCreateOptionMenu по какой-то причине. Я создаю экземпляр SearchView в этом методе и устанавливаю фокус на SearchView, чтобы пользователь мог начать поиск. Если для срабатывания onPrepareOptionsMenu требуется invalidateOptionsMenu, а onCreateOptionsMenu тоже срабатывает, фокус возвращается к SearchView. Похоже на ситуацию Catch-22. Есть еще предложения?   -  person Mridang Agarwalla    schedule 13.09.2012


Ответы (3)


Как указал Смок: позвонив invalidateOptionsMenu().

person Mridang Agarwalla    schedule 13.09.2012

У меня была такая же проблема, и я исправил ее с помощью метода supportInvalidateOptionsMenu() (потому что я использую активность поддержки), но с обходным путем.

У меня есть переменная флага, которую я проверяю в методе onCreateOptionsMenu (меню меню) следующим образом:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (!IS_MENU_FIXED) {
        // Create menu only the first time the activity is loaded
        super.onCreateOptionsMenu(menu);
        getSupportMenuInflater().inflate(R.menu.main, menu);
        // Create menu items, etc...
    }
    return true;
}

Вот как я вызываю supportInvalidateOptionsMenu(), когда это необходимо:

if (!IS_MENU_FIXED) {
    supportInvalidateOptionsMenu();
    IS_MENU_FIXED = Boolean.TRUE;
}

Это официальная документация по этой теме.

С уважением, Габриэль.

person Gabriel Volpe    schedule 24.04.2014

Я использую этот код в действии navigationDrawer, в котором есть два вложенных фрагмента (FullCoinsFragment и NewsFragment):

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.navigation, menu);

    MenuItem item = menu.findItem(R.id.action_search); //i will remove it later
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);

    return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    FullCoinsFragment test = (FullCoinsFragment)getSupportFragmentManager().findFragmentByTag(FRAGMENT_COINS);
    if (test != null && test.isVisible()) return true; // i don't want to show this menu search in NewsFragment
    menu.removeItem(R.id.action_search); //i'm removing the search option
    return true;
}

В моем NewsFragment onCreate() у меня есть это:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_news, container, false);

    //views initialization

    getActivity().invalidateOptionsMenu(); //i'm forcing the call to onCreateOptionsMenu() and onPrepareOptionsMenu

    return view;
}
person Saul_programa    schedule 17.09.2017