Фрагменты, с тем же меню, на одном и том же макете вызывают дублирование меню
У меня есть макет, который имеет 2 фрагмента. Эти фрагменты используют одно и то же меню, потому что у меня есть еще один макет, который имеет только один из них (используется в маленьком экранном устройстве).
Моя проблема - это пункты меню каждого фрагмента в меню, и поскольку они из одного и того же меню, они дублируются друг другу. Мне нужно отображать только меню из одного фрагмента, а не для обоих. В любом случае я мог бы архивировать это?
Или, возможно, лучше, создайте 2 разных меню. Один для макетов, в котором один из этих фрагментов один (который используется в устройстве с маленьким экраном), а другой - для макета, имеющего оба фрагмента. Как я могу это сделать?
Изменить: я использую библиотеку ActionBarSherlock для обратной совместимости, и я тестирую ее на эмуляторе Android 3.0.
Ответы
Ответ 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
}