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

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

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

Или, наверное, лучше создать 2 разных меню. Один для макетов, в которых есть только один из этих фрагментов (который используется в устройстве с маленьким экраном), а другой для макетов, в которых есть оба фрагмента. Как я мог это сделать?

Редактировать: я использую библиотеку ActionBarSherlock для обратной совместимости и тестирую ее на эмуляторе Android 3.0.


person mr_tawan    schedule 12.12.2011    source источник


Ответы (4)


Я нашел не очень хорошее решение. В onCreateOptionsMenu() каждого фрагмента вызовите menu.clear(), чтобы удалить любой существующий пункт меню, прежде чем раздувать меню.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);

}

Это опубликует будущие проблемы. Я могу решить использовать разные меню для каждого фрагмента, в котором каждое меню имеет общие пункты меню. Я думаю, что мы можем манипулировать меню в onCreateOptionsMenu(), но в настоящее время я не знаю, как получить элемент меню, связанный с фрагментом, прежде чем надувать его с помощью MenuInflater.

person mr_tawan    schedule 13.12.2011
comment
Вы когда-нибудь находили решение этой проблемы? Я в настоящее время сталкиваюсь с этим, а также. - person Kris B; 10.04.2012
comment
nullpointerexception в onPrepareOptionsMenu FragmentActivity. Пожалуйста, сообщите - person Umesh; 17.02.2014

Я опаздываю, но, возможно, это может помочь другим. Звучит как дизайнерский запах (если этот термин существует).

Если оба фрагмента имеют одинаковые пункты меню, и не имеет значения, какие пункты фрагмента используются (т. е. не имеет значения, нажмете ли вы пункт 1 фрагмента A или пункт 1 фрагмента B), то, вероятно, меню не должно быть частью фрагмента, но и деятельности. Это решило бы проблему дублирования.

person bigstones    schedule 09.09.2012
comment
Проблема в том, что дублирование также происходит при изменении конфигурации, и более подробное взаимодействие с ActionBar было бы очень полезно. Это не просто проблема запаха дизайна. - person dcow; 12.04.2013
comment
Да, распространенным сценарием является действие удаления, которое должно отображаться как в меню длительного нажатия в главном списке, так и на экране сведений об элементе. Пункт меню панели действий должен быть заполнен только фрагментом сведений, в то время как пункт меню длительного нажатия отображается только при длительном нажатии. - person Monstieur; 06.12.2013

вы вызываете супер метод createOptionMenu?

  • тогда может случиться так, что будут показаны все меню опций.
person alosdev    schedule 12.12.2011
comment
Да, вызывается createOpionMenu супера. - person mr_tawan; 12.12.2011
comment
тогда не вызывайте суперметод :) - person alosdev; 20.12.2011
comment
Ну, это усугубит проблему, я думаю ;-) - person mr_tawan; 21.12.2011

Я нашел обходной путь, который работает для меня. В методе onOptionsItemSelected сначала я проверяю, равен ли класс классу, который я получаю из fragmentManager, с помощью findFragmentById(R.id.content_frame).getClass() или нет.

У меня есть что-то вроде этого

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {        
        if( this.class !=  getFragmentManager().findFragmentById(R.id.content_frame).getClass() ) {
            return false; //  must do nothing
        }
        // do your menu stuff
    }
person Javier    schedule 28.09.2016