0

我正在创建一个Fragment FragParent显示几个输入字段,其中一个是 sub- 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() 已经返回子片段,是否可以替换() 子片段,或者这是一个不必要的步骤?

不,如果片段已经存在,则不需要替换它。但是,如果您的子片段不存在,则需要替换它。

B) 在父Fragment 完成inflate() 调用之前,子Fragment 是否可以在布局中被实例化和替换?

不,您需要膨胀父Fragment布局,然后Fragment在返回父布局之前将您的孩子添加到其中View

尝试这样的事情:

        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 时才应该调用。

虽然我对第二个问题不是百分百肯定,但我很确定它是否定的。

于 2013-02-03T23:47:37.967 回答