停止onCreateOptionsMenu()从分离的Fragment中调用

时间:2013-08-14 17:20:35

标签: android android-fragments android-actionbar menuitem oncreateoptionsmenu

我知道有很多代码,但请阅读第一段,如果您需要更多信息,请进一步了解!谢谢!

我想在我的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 + 2ms

D / 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 ,但效果不佳(始终隐藏,始终添加)。但我确实有电话分离和附加,这里发生了什么?

1 个答案:

答案 0 :(得分:0)

这与此解释相关联:https://groups.google.com/forum/#!msg/android-platform/QlkLMsncDwg/u3iZ-q7FCVkJ

最后,我离开了这个简单的实现,使用了一个更强大,更精致的视图寻呼机,我觉得。它原生地正确管理菜单并提供良好的动画过渡。