0

私はFragment FragParentいくつかの入力フィールドを表示するものを作成しています。そのうちの 1 つはサブフィールドで、Fragment frag特殊なオーディオ コントロールを備えています。

両方のフラグメントのレイアウトは、onCreateView()メソッドで XML から読み込まれます。私が使用しているコードは以下のとおりですが、それについていくつか質問があります。

A)replace()によって既に返されている場合、サブフラグメントに問題はfindFragmentByTag()ありませんか、それとも不要な手順ですか?

inflate()B) 親 Fragment が呼び出しを完了する前に、サブ Fragment をインスタンス化してレイアウトで置き換えることができますか?

<!-- language: lang-java  -->
// Load sub-Fragment with audio UI.
String fragStr = "fragment_audio_str";
int fragView = R.id.frag_audio_frame_layout;
FragmentManager fm = getChildFragmentManager();
FragmentTransaction fmt = fm.beginTransaction();
Fragment frag = (Fragment)  fm.findFragmentByTag(fragStr);
if (null == frag) {
    frag = new Fragment();
}
fmt.replace(fragView, frag, fragStr); 
fmt.commit();

return inflater.inflate(R.layout.fragment_parent, container, false);
} // END onCreateView() of FragParent
4

2 に答える 2

3

A) findFragmentByTag() によって既に返されている場合、サブフラグメントを replace() しても問題ありませんか、それとも不要な手順ですか?

いいえ、フラグメントが既に存在する場合は、フラグメントを置き換える必要はありません。ただし、子フラグメントが存在しない場合は、それを置き換える必要があります。

B) 親 Fragment が inflate() 呼び出しを完了する前に、サブ Fragment をインスタンス化してレイアウトで置き換えることができますか?

いいえ、親の を​​返す前に、親のFragmentレイアウトを膨らませてから、子を追加する必要があります。FragmentView

次のようなことを試してください:

        View parentFragLayout = inflater.inflate(R.layout.fragment_parent, container, false);
        FrameLayout childFragContainer = (FrameLayout) parentFragLayout.findViewById(R.id.frag_audio_frame_layout);

        // Load sub-Fragment with audio UI.
        String fragStr = "fragment_audio_str";
        FragmentManager fm = getChildFragmentManager();
        Fragment frag = fm.findFragmentByTag(fragStr);

        // Child fragment isn't there, so add it
        if (frag == null) {
            frag = new Fragment();
            FragmentTransaction fmt = fm.beginTransaction();
            fmt.replace(childFragContainer.getId(), frag, fragStr);
            fmt.commit();
        }
        return parentFragLayout;
于 2013-02-04T15:52:37.753 に答える
0

Fragment が XML レイアウトに含まれていない限り (onCreateView に追加しているため、XML レイアウトには含まれていないと想定しています)、FragmentManager を使用して Fragment を追加する必要があります。ただし、add()代わりに を使用する必要がありreplace()ます。replace()実際に別の Fragment を置き換えている場合にのみ呼び出す必要があります。

2 番目の質問については 100% 確信があるわけではありませんが、「いいえ」であると確信しています。

于 2013-02-03T23:47:37.967 に答える