我知道有很多代码,但如果您需要更多信息,请阅读第一段并进一步了解!谢谢!
我想在我的 3 个选项卡活动(无视图寻呼机)中显示上下文菜单项,只是静态选项卡。主要活动是 ActionTab.listener。我将 ActionBarActivity 与操作栏兼容一起使用。主要活动的代码如下。我使用 Google 文档附加和分离片段(如果它们第一次为空,则创建这些片段)。这是我的 LogCat,您可以看到即使仅附加并显示一个片段,也会为每个现有片段调用 onCreateOptionMenu为什么?
日志猫:
V/MainActivity(22555):在创建 MainActivity (应用程序启动)
V/onTabSelected(22555): 开始
E/MainActivity(22555):片段 1 为空
V/onTabSelected(22555):添加片段 1 (创建第一个片段)
D/Fragment1(22555):附加
D/Fragment1(22555):创建时
D/Fragment1(22555): - onCreateOPTIONMenu (一切都很好)
D/Fragment1(22555):在创建视图时
D/Fragment1(22555):在创建的活动上
D/Fragment1(22555):在开始时
D/Fragment1(22555):在简历上
D/dalvikvm(22555):GC_CONCURRENT 释放 159K,4% 释放 9115K/9415K,暂停 1ms+2ms
D/CLIPBOARD(22555):在开始输入时隐藏剪贴板对话框:由其他人完成...!
V/on Tab Un-selected(22555):开始(我选择 TAB2:取消选择 Tab1 时的回调)
V/on Tab 1 Unselected(22555): detach frag1 (FragTransac.detach(frag1) 已通过)
V/onTabSelected(22555): 开始
E/MainActivity(22555):frag 2 为空(可以创建 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):在简历上
V/on 选项卡未选中(22555):开始
V/on Tab 2 Unselected (22555): 分离 frag2
V/onTabSelected(22555): 开始
E/MainActivity(22555):片段 3 为空
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):在简历上
这是我的主要活动代码:主要活动是 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没有好的结果(总是隐藏,总是添加)。但我确实有电话分离和附加,这是怎么回事?