0

我对 Androids Fragments 的问题有兴趣。

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

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

如您所见,如果布局为空,它将被启动并且 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.

这是我的片段活动与选项卡主机的代码片段:

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

谢谢你的帮助,我很抱歉我的英语不好:-)

4

1 回答 1

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();
    }
}
于 2013-10-17T08:47:10.307 回答