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

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

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

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

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

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

4b9b3361

Ответ 1

Я нашел не очень хорошее решение. В 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.

Ответ 2

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

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

Ответ 3

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

  • то может случиться так, что будут показаны все опции options.

Ответ 4

Я нашел работу, чтобы она работала для меня. В методе onOptionsItemSelected сначала я делаю свой чек, если класс, равный или не принадлежащий классу i, получает от instanceManager с помощью 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
    }