【问题标题】:Android Fragment: the specified child already has a parent fragment - ErrorAndroid片段:指定的孩子已经有一个父片段 - 错误
【发布时间】:2012-11-08 08:19:30
【问题描述】:

我对 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.

这是我的 Fragment-Activity 与 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);
                }
            }

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

【问题讨论】:

    标签: android layout view parent fragment


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      相关资源
      最近更新 更多