1

多くのコードがあることは知っていますが、最初の段落を読んで、さらに情報が必要な場合はさらに進んでください! ありがとう!

3 つのタブ アクティビティ (ビュー ページャーなし) にコンテキスト メニュー項目を表示したいのですが、静的タブだけです。主なアクティビティは ActionTab.listener です。アクションバー互換で ActionBarActivity を使用しました。主なアクティビティのコードは次のとおりです。Google ドキュメントを使用してフラグメントをアタッチおよびデタッチしました (最初に null の場合に作成されます)。これが私の LogCat です。onCreateOptionMenu が1 つだけ添付されて表示されている場合でも、既存のフラグメントごとに呼び出されることがわかります。なぜですか?

LogCat:

V/MainActivity(22555): MainActivity の作成時(アプリケーションの起動時)

V/onTabSelected(22555): 開始

E/MainActivity(22555): フラグ 1 が null です

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 を解放、9115K/9415K を 4% 解放、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 が null です(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 未選択 (22555): detach frag2

V/onTabSelected(22555): 開始

E/MainActivity(22555): フラグ 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): レジューム時

これが私のメイン アクティビティ コードです。メイン アクティビティは ActionTab.listener です。アクションバー互換で ActionBarActivity を使用しました。主なアクティビティのコードは次のとおりです。Google ドキュメントを使用してフラグメントをアタッチおよびデタッチしました (最初に null の場合に作成されます)。

 @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 の例で見たように、これをコントロールにラップする必要があるかもしれませんが、どのように、なぜそれを行う必要があるのか​​ わかりません。

@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 に答える