“指定的孩子已经有父母”错误

时间:2012-01-26 20:54:23

标签: android android-layout layoutparams

我有一个页面会显示一个星期值的预定游戏的选定运动。所选的运动和周存储在页面开头打开的XML文件中。当我点击下周链接时,新的周日期值将存储到此xml文件中,然后重新加载页面。现在应显示下周的任何游戏。这些游戏显示在tablelayout中,我在.java页面中根据需要以编程方式创建行。 以下是代码的简化示例。

TableLayout tlGames = (TableLayout)findViewById(R.id.table_games);

for (int i = 0; i < gameCount; i++) 
{

TableRow trGameHomeTeam = new TableRow(this);

TextView tvHomeTeamName = new TextView(this);

tvHomeTeamName.setText("Home Team Name Here");

tvHomeTeamName.setLayoutParams(new LayoutParam (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

TextView tvHomeTeamScore = new TextView(this);

tvHomeTeamScore.setText("Home Team Score Here");

tvHomeTeamScore.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

trGameHomeTeam.addView(tvHomeTeamName);

trGameHomeTeam.addView(tvHomeTeamScore);

tlGames.addView(trGameHomeTeam,new TableLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));

}           

当我最初运行我的应用时,正确列出了当前日期的游戏。然后,当我点击下周链接时,它应该重新加载此页面并显示这个新周的游戏。相反,我收到一条错误消息“指定的孩子已经有父。你必须首先在孩子的父母上调用removeView()。”我添加了一个“tlGames.removeAllViews();”紧接在TableLayout tlGames行之后但这没有纠正错误。

我唯一的地方是“addView”用于创建表格行或表格行中的文本视图。

谁能告诉我我做错了什么?

由于

3 个答案:

答案 0 :(得分:4)

我的猜测是,通过重新加载页面来显示本周的游戏,您可以使用布局inflater来夸大细节布局吗?

布局inflater是我看到这个错误发生的唯一地方,如果是这种情况,将第三个参数false传递给inflate方法,因为它会尝试给视图的根充气,否则会抛出这个例外还给你。

inflater.inflate(R.layout.profile, container, false);

答案 1 :(得分:0)

首先,你必须告诉你哪一行得到了这个错误。或者放入堆栈跟踪。

现在,您收到该错误消息只是因为您已经拥有该视图,并且您将再次在同一视图的位置添加另一个视图。

因此,在添加其他视图之前,首先删除具有特定名称的添加视图。

实施例。 tl.removeView(blablabla); 然后添加视图。

或者

如果你想加载循环条件的特定视图,那么你也可以试试这个。

根据循环条件创建另一个xml。 防爆。比如child.xml

然后根据循环条件将该布局添加到主布局。您还可以使用该循环中的该布局数据进行访问。

看看我已经完成的这个循环。

    for (int i = 0; i<=tempEmployerList.size()-1; i++) {  
            LinearLayout EmpItem = (LinearLayout)LayoutInflater.from        (getApplicationContext()).inflate(R.layout.child, null); 
   // to access with the data use this

    ((TextView)EmpItem.findViewById(R.id.taxcodeTextView)).setText(TAXCODE);


    // Finaly add that loopLayout to your layout to your main layout like this
    myLinearLayout.addView(EmpItem); 
}

我会对它进行测试,这对你很有帮助。

如果没有,请告知我。

或者

如果您仍想使用自己的代码执行某些操作,请了解this example

它会帮助你。

享受。 :))

答案 2 :(得分:0)

我已经纠正了一些错误。再纠正两个:

    tvHomeTeamName.setLayoutParams(new TableRow.LayoutParams (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

...

    tvHomeTeamScore.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

通过这些更正,它会在我身上运行。