Android片段:指定的子级已具有父级片段-错误

Android片段:指定的子级已具有父级片段-错误,android,layout,view,parent,fragment,Android,Layout,View,Parent,Fragment,我有一个机器人碎片的问题 我有一个片段活动,它由一个TabHost和4个tab组成。 其中一个选项卡显示图表。图表数据的计算很复杂,需要一段时间。 问题:假设用户单击特定选项卡,图表的计算开始,一切正常。现在,用户单击下一个选项卡,应用程序将显示内容。之后,用户切换回“图表”选项卡。因此它不会重新加载,我在图表片段的onCreateView中执行以下操作: @Override public View onCreateView(LayoutInflater inflater, ViewGr

我有一个机器人碎片的问题

我有一个片段活动,它由一个TabHost和4个tab组成。 其中一个选项卡显示图表。图表数据的计算很复杂,需要一段时间。 问题:假设用户单击特定选项卡,图表的计算开始,一切正常。现在,用户单击下一个选项卡,应用程序将显示内容。之后,用户切换回“图表”选项卡。因此它不会重新加载,我在图表片段的onCreateView中执行以下操作:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if(layout == null){
        layout = new PedelecRelativeLayout(getActivity());
        initUI();
    }
    return layout;
}
如您所见,如果布局为null,它将被初始化,initUI()将生成图表

第一次单击选项卡可以工作,但第二次单击选项卡时,应用程序将崩溃,出现以下错误:

11-20 10:32:36.928: E/AndroidRuntime(9888): FATAL EXCEPTION: main
11-20 10:32:36.928: E/AndroidRuntime(9888): java.lang.IllegalStateException: The     specified child already has a parent. You must call removeView() on the child's parent first.
下面是我与Tab Host的片段活动的代码片段:

summaryDiagram = (SummaryDiagramFragment)  fm.findFragmentByTag(TAB_DIAGRAM);
...
if(summaryDiagram != null){
                ft.detach(summaryDiagram);
            }
...

if(tabId.equals(TAB_DIAGRAM)){
                if(summaryDiagram==null){
                    /** Create AndroidFragment and adding to fragmenttransaction */
                    summaryDiagram = new SummaryDiagramFragment();
                    ft.add(R.id.realtabcontent, summaryDiagram, TAB_DIAGRAM);
                }else{
                    /** Bring to the front, if already exists in the fragmenttransaction */
                    ft.attach(summaryDiagram);
                }
            }

谢谢你的帮助,我的sry也因为我的英语不好:-)

你不能自己拆下碎片然后重新连接。它应该保持活跃。 要在每次onCreate(Bundle arg)调用后获得片段实例,如果活动正在从保存状态还原,则必须在FragmentManager中找到片段

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_layout);

    if (savedInstanceState != null) {
        fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);

    } else {
        fragment = Fragment.instantiate(this, YourFragment.class.getName());
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.fragment_container, fragment, YourFragment.class.getName());
        ft.commit();
    }
}