Вызов setHasOptionsMenu (true) из фрагмента приводит к нескольким вызовам onCreateOptionsMenu в действии

У меня есть простая Activity которая содержит ViewPager . Я пытаюсь добавить некоторые пункты меню в меню из одного из моих Fragment , но я получаю странное поведение. Вызов: setHasOptionsMenu(true); Из моего фрагмента приводит к включению onCreateOptionsMenu() Activity, который onCreateOptionsMenu() каждый раз, когда я изменяю фрагменты в ViewPager . Это нормально?

Это абсолютно «нормально». Это может не соответствовать вашему конкретному варианту использования, но это определенно предназначенное поведение.

Взгляните на источник для android.support.v4.app.Fragment.setHasOptionsMenu ():

 public void setHasOptionsMenu(boolean hasMenu) { if (mHasMenu != hasMenu) { mHasMenu = hasMenu; if (isAdded() && !isHidden()) { mActivity.supportInvalidateOptionsMenu(); } } } 

Вы можете видеть, что он вызывает supportInvalidateOptionsMenu() в своей активности, что в конечном итоге приводит к onCreateOptionsMenu() для активности и всех ее фрагментов. Так как структура управляет обновлением меню опций, когда фрагмент добавляется / удаляется из диспетчера фрагментов активности.