onPrepareOptionsMenu Дублирует элемент в ActionBar - PullRequest
3 голосов
/ 29 февраля 2012

Когда я добавляю пункт меню с помощью onPrepareOptionsMenu, этот пункт меню дублируется в панели действий.Я использую фрагменты и создаю начальное меню в ActionBar в основной деятельности следующим образом:

...
 @Override
    public boolean onCreateOptionsMenu(Menu paramMenu) {
    super.onCreateOptionsMenu(paramMenu);
    paramMenu.add(0, 1, 0, "DashBoard").setIcon(R.drawable.ic_dashboard)
        .setShowAsAction(1);
    return true;
    }

Затем я добавляю еще один элемент в один из фрагментов следующим образом:

...
@Override
    public void onPrepareOptionsMenu(Menu paramMenu) {
    paramMenu.add(0, 2, 1, "FullScreen").setIcon(R.drawable.ic_fullscreen)
        .setShowAsAction(1);
    }

По какой-то причине этот добавленный элемент через класс фрагмента отображается дважды .... У меня что-то не так?

Любая помощь в том, что я ошибаюсь, будет оценена

Ответы [ 3 ]

13 голосов
/ 16 мая 2013

onPrepareOptionsMenu вызывается каждый раз перед отображением меню.

Используйте menu.clear() в onPrepareOptionsMenu (), а затем добавьте новый пункт меню.

4 голосов
/ 29 февраля 2012

Возможно, элемент отображается дважды, потому что вы добавляете его дважды. См. документы для onPrepareOptionsMenu:

Вызывается непосредственно перед отображением меню, каждый раз, когда оно отображается.

Я бы никогда не стал слепо добавлять предмет в onPrepareOptionsMenu. Вы должны проверить, был ли он уже добавлен первым.

0 голосов
/ 13 июня 2015

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

  @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        //menu.clear();
        if(menu.size() == 1) {
            // inflater.inflate(R.menu.dashboard_main,menu);
            MenuItem mit = menu.add("Refresh");
            mit.setIcon(android.R.drawable.stat_notify_sync);
            mit.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        }
    }

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

...