1

FragmentPagerAdapter を使用して、MyFrag タイプのいくつかのタブ (フラグメントに関連付けられている) を表示しています。MyFrag.onCreateView() 内で、いくつかの内部フラグメント (MyInternalF1 と MyInternalF2) をプログラムでインフレートします。

私が得るのは、ぎこちない表示結果です。外部の MyFrag インスタンスは問題なく、タブに関連付けられています。しかし、内部フラグメントは間違ったフラグメント内に埋め込まれています...最初の MyFrag には独自の内部フラグメントが含まれていますが、2 番目、3 番目などの MyFrag には内部フラグメントがないか、他のフラグメントの内部フラグメントをホストしています。(内部フラグメントは問題なく動作します。ランダムなフラグメントに配置されているだけです)。

v13 サンプルのタブ/ページャー サンプル ウィジェットを使用しています: samples/Support13Demos/src/com/example/android/supportv13/app/FragmentPagerSupport.java

擬似コード:

Class MyFrag extends Fragment
{
    public View onCreateView(LayoutInflater inflater,
        ViewGroup container,Bundle savedInstanceState)
{
    super.onCreateView(inflater, container, savedInstanceState);
    ....
    FragmentTransaction trans = getFragmentManager().beginTransaction();
    trans.add(R.id.myfragContainer, new MyInternalF1, "InternalF1");
    trans.add(R.id.myfragContainer, new MyInternalF2, "InternalF2");
    trans.commit();
    ....
}
4

1 に答える 1

1

問題は FragmentTransaction.add() 関数にあります。最初のパラメーターとして、含まれているビューの ID - containerViewId を取ります。ビューを直接渡すことはできません。ID を使用する必要があります。明らかに、インフレートされたビューの場合、コンテナー ビューの id はすべてのインフレートされたインターフェイスで同じです。それらはすべて同じアクティビティにあるため、トランザクションは最初に見つけたビュー インスタンスを選択します。あなたはそれを制御することはできません。そのため、MyFragment が onCreate() を呼び出すと、内部 Fragments が親に属していないビューに追加される場合があります。

これは FragmentTransaction API の問題です。親ビューとして、単なる ID ではなく、明示的なビューを指定できるようにするとよいでしょう。参照: http://code.google.com/p/android/issues/detail?id=54051

とにかく、今のところ回避策があります。onCreate 関数でコンテナーの ID を手動で変更するだけです。次に、変更した ID を add() 関数に渡します。参照: Programmatic Views 一意の ID を設定する方法 (generateViewId() 関数用)。

Class MyFrag extends Fragment
{
    public View onCreateView(LayoutInflater inflater,
        ViewGroup container,Bundle savedInstanceState)
    {
        super.onCreateView(inflater, container, savedInstanceState);
        ....
        int containerID = generateViewId();
        infView.findViewById(R.id.frag_container).setId(containerID);

        FragmentTransaction trans = getFragmentManager().beginTransaction();
        trans.add(containerID, new MyInternalF1, "InternalF1");
        trans.add(containerID, new MyInternalF2, "InternalF2");
        trans.commit();
        ....
        return infView;
    }
}
于 2013-04-08T06:32:13.317 に答える