【问题标题】:"specified child already has a parent" error“指定的孩子已经有父母”错误
【发布时间】:2012-02-19 23:07:06
【问题描述】:

我有一个页面,其中会显示某项选定运动的为期数周的预定比赛。选定的运动和星期存储在页面开头打开的 XML 文件中。当我点击下周链接时,一个新的星期日期值被存储到这个 xml 文件中,然后页面被重新加载。现在应该显示下周的任何游戏。这些游戏显示在一个表格布局中,我在其中以编程方式根据需要在 .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”的唯一地方是用于创建表格行或表格行中的文本视图。

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

谢谢

【问题讨论】:

  • 信息不足。我们能看到所有的 onCreate 方法、下周监听器和 xml 吗?
  • 在此处发布完整的堆栈跟踪。
  • 请把整个活动代码放在这里。还有布局。

标签: android android-layout layoutparams


【解决方案1】:

我的猜测是,随着页面重新加载以显示本周的游戏,您使用布局充气器来充气细节布局?

布局充气器是我看到此错误发生的唯一地方,如果是这种情况,请将 false 的第三个参数传递给充气方法,否则它将尝试充气视图的根,从而抛出这个例外在你身上。

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

【讨论】:

    【解决方案2】:

    首先你必须知道你在哪一行得到了那个错误。或者放置堆栈跟踪。

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

    所以在添加另一个视图之前先删除具有特定名称的添加视图。

    例如。 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

    它一定会帮助你的。

    享受。 :))

    【讨论】:

    • 这是我的第一个应用程序,所以我正在努力解决这个问题。如何找到发生错误的行号?我已经复制并粘贴了下面的堆栈跟踪(来自 LogCat)。编辑,由于空间限制,我无法粘贴完整的堆栈跟踪。 01-27 11:28:58.132: E/AndroidRuntime(16437): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.msasports.scoreboard/com.msasports.scoreboard.Scores}: java.lang.IllegalStateException: The指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()。
    【解决方案3】:

    如我所见,您已经纠正了一些错误。更正两个:

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

    有了这些更正,它就会冲向我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2017-05-21
      • 2021-06-04
      相关资源
      最近更新 更多