1

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

我想在我的 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没有好的结果(总是隐藏,总是添加)。但我确实有电话分离和附加,这是怎么回事?

4

1 回答 1

0

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

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

于 2013-09-20T10:41:10.083 回答