Почему метод Activity onCreateOptionMenu() вызывается два раза с использованием setHasOptionMenu(true) для его фрагментов?

Я управляю некоторыми Fragmentв моем собственном ActionBarActivity названный MainActivity, Один Fragment показывается за один раз. Пример должен быть простым. Fragment который показывает, должен был получить меню опций при определенных условиях.

Вот мой код:

public class MainActivity extends ActionBarActivity{

...

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // The certain conditions. You might know the background. ;-)
        final boolean hasMenu = mNavigationDrawer.isDrawerOpen() ? false : true;

        // The reference to the fragment which is shown
        mCurrentShownFragment.setHasOptionsMenu(hasMenu);

        return super.onCreateOptionsMenu(menu);

    }

...

}

Из-за вызова mCurrentShownFragment.setHasOptionMenu(true)MainActivityи Fragment"s onCreateOptionMenu(...) называется два раза.

Первый вопрос: почему?
Второй вопрос: это нормально?
Третий вопрос: если ответ на второй вопрос неверен. Как я мог предотвратить это?

С наилучшими пожеланиями, Барок

1 ответ

Решение

Посмотрите на источник setHasOptionsMenu:

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

это вызывает supportInvalidateOptionsMenu():

public void supportInvalidateOptionsMenu() {
    if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) {
        // If we are running on HC or greater, we can use the framework
        // API to invalidate the options menu.
        ActivityCompatHoneycomb.invalidateOptionsMenu(this);
        return;
    }

    mOptionsMenuInvalidated = true;
}

Какие звонки invalidateOptionsMenu(this):

public void invalidateOptionsMenu () Добавлено на уровне API 11

Объявите, что меню опций изменилось, поэтому его следует создать заново. onCreateOptionsMenu(Menu) метод будет вызван при следующем отображении.

Так что абсолютно нормально, что он называет onCreateOptionsMenu потому что это как setHasOptionsMenu работает

Другие вопросы по тегам