我知道有很多代码,但请阅读第一段,如果您需要更多信息,请进一步了解!谢谢!
我想在我的3个标签活动(没有视图寻呼机)中显示上下文菜单项,只显示静态标签。主要活动是ActionTab.listener。我使用ActionBarActivity和action bar compat。主要活动的代码如下。我使用Google文档来附加和分离片段(如果它们第一次为空则创建它们)。这是我的LogCat,你可以看到为每个现有片段调用 onCreateOptionMenu,即使只有一个片段被附加和显示为什么?
logcat的:
V / MainActivity(22555):创建MainActivity (应用程序启动)
V / onTabSelected(22555):开始
E / MainActivity(22555):frag 1为空
V / onTabSelected(22555):添加片段1 (创建第一个片段)
D / Fragment1(22555):on Attach
D / Fragment1(22555):on create
D / Fragment1(22555): - onCreateOPTIONMenu (一切都很好)
D / Fragment1(22555):创建视图
D / Fragment1(22555):on Activity Created
D / Fragment1(22555):开始时
D / Fragment1(22555):on Resume
D / dalvikvm(22555):GC_CONCURRENT释放159K,4%免费9115K / 9415K,暂停1ms + 2msD / CLIPBOARD(22555):在开始输入时隐藏剪贴板对话框:由其他人完成...!
> V / on选项卡未选中(22555):开始(我选择TAB2:取消选择Tab1时回调)V / on选项卡1未选中(22555):分离frag1 (已传递FragTransac.detach(frag1))
V / onTabSelected(22555):开始
E / MainActivity(22555):frag 2为null (确定创建frag2)
V / onTabSelected(22555):添加片段2
D / Fragment2(22555):on Attach
D / Fragment1(22555): - onCreateOPTIONMenu (为什么要调用它,你是分离的,frag1!)
D / Fragment2(22555): - onCreateOPTIONMenu (frag2 ok)
D / Fragment2(22555):on create
D / Fragment2(22555):创建视图
D / Fragment2(22555):on Activity Created
D / Fragment2(22555):开始时
D / Fragment2(22555):on Resume
V / on选项卡未选中(22555):开始
V / on选项卡2未选中(22555):分离frag2
V / onTabSelected(22555):开始
E / MainActivity(22555):frag 3为空
V / onTabSelected(22555):添加片段3
D / Fragment3(22555):on Attach
D / Fragment1(22555): - onCreateOPTIONMenu (再次出现问题)
D / Fragment2(22555): - onCreateOPTIONMenu (为frag2重复的问题)
D / Fragment3(22555): - onCreateOPTIONMenu (我对frag3的期望)
D / Fragment3(22555):on create
D / Fragment3(22555):on Activity Created
D / Fragment3(22555):开始时
D / Fragment3(22555):on Resume
这是我的主要活动代码:主要活动是ActionTab.listener。我使用ActionBarActivity和action bar compat。主要活动的代码如下。我使用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;
}
}
片段构建为Fragment的扩展。 这是片段onCreateOptionsMenu()。 我把setHasOption设置为true。也许我应该在CommonsWare示例here中看到它控制在一个控件中,但我不明白我该怎么做以及为什么要这样做?
@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 ,但效果不佳(始终隐藏,始终添加)。但我确实有电话分离和附加,这里发生了什么?
答案 0 :(得分:0)
这与此解释相关联:https://groups.google.com/forum/#!msg/android-platform/QlkLMsncDwg/u3iZ-q7FCVkJ
最后,我离开了这个简单的实现,使用了一个更强大,更精致的视图寻呼机,我觉得。它原生地正确管理菜单并提供良好的动画过渡。