Я знаю, что есть много кода, но прочитайте первый абзац и идите дальше, если вам нужна дополнительная информация! Спасибо!
Я хочу отобразить пункт контекстного меню в моей активности с тремя вкладками (без просмотра пейджера), просто статические вкладки. Основное действие - 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 без хороших результатов (всегда скрытых, всегда добавленных). Но у меня есть звонки, отсоединяющие и прикрепляемые, Что здесь происходит?