Android Fragment:指定的子节点已经有一个父片段 - 错误

时间:2012-11-20 09:37:32

标签: android layout view parent fragment

我对动物片段的问题有所了解。

我有一个Fragment-Activity,它包含一个带有4个Tabs的TabHost。 其中一个标签显示了一个图表。图表数据的计算很复杂,需要一段时间。 问题:让我们假设用户点击特定的选项卡,图表的计算开始,一切正常。现在,用户点击下一个标签,应用就会显示内容。之后,用户切换回Diagramm-Tab。因此它不会重新加载,我在Diagramm-Fragment的onCreateView中执行以下操作:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if(layout == null){
        layout = new PedelecRelativeLayout(getActivity());
        initUI();
    }
    return layout;
}

如您所见,如果布局为null,则它将启动,initUI()将生成Diagramm。

第一次单击该选项卡有效,但在第二次单击选项卡时,应用程序崩溃并出现以下错误:

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继承我的Fragment-Activity的Code-Snipplet:

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);
                }
            }

感谢您的帮助,感谢我的英语不好: - )

1 个答案:

答案 0 :(得分:0)

您不得自行分离然后重新附加片段。它应该保留在活动上。 要在每次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();
    }
}