Android 在充气前创建安卓子碎片
我正在创建一个Android 在充气前创建安卓子碎片,android,android-fragments,android-inflate,Android,Android Fragments,Android Inflate,我正在创建一个片段FragParent显示多个输入字段,其中一个是带有专门音频控件的子片段
片段
FragParent
显示多个输入字段,其中一个是带有专门音频控件的子片段
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对象来判断片段是否正在使用先前保存的状态重新创建。