Остановить onCreateOptionsMenu() для вызова из отдельного фрагмента

Я знаю, что есть много кода, но прочитайте первый абзац и идите дальше, если вам нужна дополнительная информация! Спасибо!

Я хочу отобразить пункт контекстного меню в моей активности с тремя вкладками (без просмотра пейджера), просто статические вкладки. Основное действие - ActionTab.listener. Я использовал ActionBarActivity с панелью действий. Ниже приведен код основного действия. Я использовал документы Google для прикрепления и отсоединения фрагментов (которые создаются, если они являются нулевыми в первый раз). Вот мой LogCat, вы можете видеть, что onCreateOptionMenu вызывается для каждого существующего фрагмента, даже если только один подключен и отображается. Почему?

LogCat:

V/MainActivity (22555): при создании MainActivity (приложение запускается)

V/onTabSelected (22555): начало

E/MainActivity (22555): frag 1 is null

V/onTabSelected (22555): добавить фрагмент 1 (создает 1-й фрагмент)

D/Fragment1 (22555): on Attach

D/Fragment1 (22555): при создании

D/Fragment1 (22555): - onCreateOPTIONMenu (все в порядке)

D/Fragment1 (22555): при создании представления

D/Fragment1 (22555): о созданной деятельности

D/Fragment1 (22555): при запуске

D/Fragment1 (22555): on Resume

D/dalvikvm (22555): GC_CONCURRENT освобожден 159K, 4% бесплатно 9115K/9415K, приостановлено 1ms + 2ms

D/CLIPBOARD (22555): Скрыть диалог буфера обмена при запуске ввода: завершено кем-то еще...!

V/on Tab Un-selected (22555): начало (я выбираю TAB2: обратный вызов для отмены выбора Tab1)

V/на вкладке 1 Не выбрано (22555): отсоединить frag1 (FragTransac.detach(frag1) был передан)

V/onTabSelected (22555): начало

E/MainActivity (22555): frag 2 - null (ok, который создает frag2)

V/onTabSelected (22555): добавить фрагмент 2

D/Fragment2 (22555): прикрепить

D/Fragment1 (22555): - onCreateOPTIONMenu (почему он называется, вы отсоединены, frag1!)

D/Fragment2 (22555): - onCreateOPTIONMenu (frag2 ok)

D/Fragment2 (22555): при создании

D/Fragment2 (22555): при создании представления

D/Fragment2 (22555): о созданной деятельности

D/Fragment2 (22555): при запуске

D/Fragment2 (22555): on Resume

V/on Tab Un-selected (22555): запуск

V/на вкладке 2 Не выбрано (22555): отсоединить frag2

V/onTabSelected (22555): начало

E/MainActivity (22555): frag 3 имеет значение null

V/onTabSelected (22555): добавить фрагмент 3

D/Fragment3 (22555): прикрепить

D/Fragment1 (22555): - onCreateOPTIONMenu (снова проблема)

D/Fragment2 (22555): - onCreateOPTIONMenu (проблема повторяется для frag2)

D/Fragment3 (22555): - onCreateOPTIONMenu (поведение, которое я ожидаю для frag3)

D/Fragment3 (22555): при создании

D/Fragment3 (22555): о созданной деятельности

D/Fragment3 (22555): при запуске

D/Fragment3 (22555): on Resume

Это мой основной код активности: Основное действие - ActionTab.listener. Я использовал ActionBarActivity с панелью действий. Ниже приведен код основного действия. Я использовал документы Google для прикрепления и отсоединения фрагментов (которые создаются, если они ноль в первый раз).

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v("MainActivity", "on create MainActivity");
    // Set the Action Bar to use tabs for navigation
    ab = getSupportActionBar();
    ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    tab1 = ab.newTab().setText("Tab 1").setTabListener(this);
    ab.addTab(tab1);
    tab2 = ab.newTab().setText("Tab 2").setTabListener(this);
    ab.addTab(tab2);
    tab3 = ab.newTab().setText("Tab 3").setTabListener(this);
    ab.addTab(tab3);
}

@Override
public void onResume(){ 
    super.onResume();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate menu from menu resource (res/menu/main)
    getMenuInflater().inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

public boolean isInBooking() {
    return isInBooking;
}

// Implemented from ActionBar.TabListener
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
    // This is called when a tab is selected.
    Log.v("onTabSelected", "starting");
    switch(tab.getPosition()){
    case 0: 

        if (frag1==null) {
            Log.e(TAG, "frag 1 is null");
            frag1 = new Fragment1();
            ft.add(android.R.id.content, frag1);
            Log.v("onTabSelected", "add fragment 1");
        }else {
            ft.attach(frag1);
            Log.v("onTabSelected", "Attach fragment 1");
        }
        break;
    case 1:
        if (frag2==null) {
            Log.e(TAG, "frag 2 is null");
            frag2 = new Fragment2();
            ft.add(android.R.id.content, frag2);
            Log.v("onTabSelected", "add fragment 2");
        } else {
            ft.attach(frag2);
            Log.v("onTabSelected", "Attach fragment 2");
        }
        break;
    case 2:
        if (frag3==null) {
            Log.e(TAG, "frag 3 is null");
            frag3 = new Fragment3();
            ft.add(android.R.id.content, frag3);
            Log.v("onTabSelected", "add fragment 3");
        } else {
            ft.attach(frag3);
            Log.v("onTabSelected", "Attach fragment 3");
        }
        break;
    default:
        break;
    }
}

// Implemented from ActionBar.TabListener
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
    // This is called when a previously selected tab is unselected.
    Log.v("on Tab  Un-selected", "starting");
    switch(tab.getPosition()){
    case 0: 
        ft.detach(frag1);
        Log.v("on Tab 1 Unselected", "detach frag1");
        break;
    case 1:
        ft.detach(frag2);
        Log.v("on Tab 2 Unselected", "detach frag2");
        break;
    case 2:
        ft.detach( frag3);
        Log.v("on Tab 3 Unselected", "detach frag3");
        break;
    default:
        break;
    }
}

Фрагменты строятся как расширение фрагмента. Вот фрагмент onCreateOptionsMenu(). Я положил setHasOption в true. Возможно, я должен был использовать это в контроле, как я видел на примере CommonsWare здесь, но я не понимаю, как и зачем мне это делать?

@Override 
public void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) {
    if(!isDetached()) {
        Log.d(TAG, " - onCreateOPTIONMenu");        
        inflater.inflate(R.menu.fragment1, menu);
    } else Log.v(TAG, "not attached - onCreateOPTIONMenu"); 
} 

Я также пробовал isAdded() или isHidden без хороших результатов (всегда скрытых, всегда добавленных). Но у меня есть звонки, отсоединяющие и прикрепляемые, Что здесь происходит?

Ответ 1

Это связано с этим объяснением: https://groups.google.com/forum/#!msg/android-platform/QlkLMsncDwg/u3iZ-q7FCVkJ

В конце концов, я оставил эту простую реализацию, чтобы пойти с пейджером представления, который является более мощным и более совершенным, я чувствую. Он изначально правильно управляет меню и обеспечивает хороший переход анимации.