17

アクションバーのタブのフラグメント内にフラグメントを配置できますか?

3 つのタブを持つアクション バーを持つメイン アクティビティを持つ Android (3.0/Honeycomb) アプリケーションがあります。タブはアクティビティの onCreate() メソッドに追加され、タブ フラグメントは TabListener で追加/削除されます。コードはhttp://developer.android.com/guide/topics/ui/actionbar.html#Tabsのサンプルとほぼ同じです。

TabListener は次のようになります。

public class SwapOutTabListener implements ActionBar.TabListener {
    public SwapOutTabListener(Fragment fragment) {
        _fragment = fragment;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.add(R.id.fragment_container, _fragment, null);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(_fragment);
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // do nothing
    }

    private Fragment _fragment;
}

私のタブの 2 つは単純なフラグメントです。それらには単一の TextView が含まれているだけで、次のようになります (明確にするためにほとんどの属性が削除されています)。

<LinearLayout>
    <TextView android:text="Tab 1" />
</LinearLayout>

しかし、私のタブの 1 つのフラグメントはより複雑で、次のような 2 つの埋め込みフラグメントが含まれています。

<LinearLayout>
    <fragment
        android:name="...Fragment_1"
        android:id="@+id/frag1"
    />
    <fragment
        android:name="...Fragment_2"
        android:id="@+id/frag2"
    />
</LinearLayout>

ユーザーがこのフラグメントのタブを選択すると、すべての起動ライフサイクル メソッド (onStart()、onResume()) が 3 つのフラグメントすべて (タブ フラグメントと 2 つの埋め込みフラグメント) に対して呼び出されます。

しかし、ユーザーが別のタブを選択すると、タブ フラグメントのみがライフサイクル終了メソッド (onPause()、onStop() など) のいずれかを取得します。2 つの埋め込まれたフラグメントは、これらの呼び出しのいずれも受信せず、シャットダウンされることもありません。

これにより、タブ フラグメントをロードするときにランタイムがフラグメント ID の重複を訴えるため、タブが再選択されたときに問題が発生します。

Binary XML file line #7: Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with another fragment for ...Fragment_1

タブフラグメントが削除されたときにこれらの埋め込まれたフラグメントを削除するのは私の責任ですか? もしそうなら、いつ、正確に、私はそれをしますか?

4

2 に答える 2

19

いいえ、フラグメントは現在階層内にありません。私はこれを行うことを検討しましたが、この時点で、そのすべてのユースケースは、主にフラグメントの極端な過剰使用によって推進されており、各個別のUI要素はフラグメントとして実装されています。これは、それらが使用されることを意図した方法ではなく、アプリケーションの主要なトップレベルの部分をカプセル化することを目的としています。階層がある場合は、それがレイアウトとビューの目的です。

于 2011-03-12T00:49:41.667 に答える
1

ああ。実感。これを見つけました - 「注: レイアウトに が含まれている場合、レイアウトをフラグメントにインフレートすることはできません。ネストされたフラグメントは、フラグメントに動的に追加された場合にのみサポートされます。」

http://developer.android.com/about/versions/android-4.2.html#NestedFragments

于 2013-01-04T20:08:24.313 に答える