Android 在充气前创建安卓子碎片

Android 在充气前创建安卓子碎片,android,android-fragments,android-inflate,Android,Android Fragments,Android Inflate,我正在创建一个片段FragParent显示多个输入字段,其中一个是带有专门音频控件的子片段

我正在创建一个
片段
FragParent
显示多个输入字段,其中一个是带有专门音频控件的子
片段

这两个片段的布局都是从XML加载到它们的
onCreateView()
方法中的。 我使用的代码如下,但我有一些问题:

A) 如果子片段已经由
findFragmentByTag()
返回,那么替换它可以吗?或者这是一个不必要的步骤吗

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

<!-- 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

//用音频用户界面加载子片段。
字符串fragStr=“fragment\u audio\u str”;
int fragView=R.id.frag\u音频\u帧布局;
FragmentManager fm=getChildFragmentManager();
FragmentTransaction fmt=fm.beginTransaction();
Fragment frag=(Fragment)fm.findffragmentbytag(fragStr);
if(null==frag){
frag=新片段();
}
fmt.更换(fragView、frag、fragStr);
fmt.commit();
返回充气机。充气(R.layout.fragment\u父级,容器,假);
}//FragParent的END onCreateView()

除非片段包含在XML布局中(由于您是在onCreateView中添加它,我假设它不包含在XML布局中),否则仍然需要使用FragmentManager添加片段。但是,您应该使用
add()
而不是
replace()
。只有在实际替换另一个片段时,才应该调用
replace()


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

除非您的片段包含在您的XML布局中(由于您在onCreateView中添加了片段,我假设它不包含在您的XML布局中),否则您仍然需要使用FragmentManager来添加片段。但是,您应该使用
add()
而不是
replace()
。只有在实际替换另一个片段时,才应该调用
replace()

虽然我对第二个问题不是百分之百的肯定,但我很肯定这是一个否定的问题

A) 如果findFragmentByTag()已经返回子片段,那么替换()子片段可以吗?或者这是一个不必要的步骤吗

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

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

否,在返回父级的
视图之前,您需要将父级
片段
布局充气,然后将子级
片段
添加到其中

试着这样做:

        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;
A) 如果findFragmentByTag()已经返回子片段,那么替换()子片段可以吗?或者这是一个不必要的步骤吗

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

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

否,在返回父级的
视图之前,您需要将父级
片段
布局充气,然后将子级
片段
添加到其中

试着这样做:

        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;

“您应该使用add()而不是replace()”--您的依据是什么?如果它在创建后再次被调用呢?我唯一的依据是文档。根据我个人的经验,我发现通常最好使用方法达到预期目的。为了实现这一点,我将覆盖适当的片段生命周期回调,并使用Bundle对象来判断片段是否正在使用以前保存的状态重新创建。“您应该使用add()而不是replace()”--您的依据是什么?如果它在创建后再次被调用呢?我唯一的依据是文档。根据我个人的经验,我发现通常最好使用方法达到预期目的。为了实现这一点,我将覆盖适当的片段生命周期回调,并使用Bundle对象来判断片段是否正在使用先前保存的状态重新创建。