排查 Android 错误:“指定的子项已经有父级”
在布局之间频繁切换时,您可能会遇到错误“The指定的子项已经有父项。您必须先在子项的父项上调用removeView() (Android)。”当将视图(例如 TextView 或 EditText)添加到已附加到应用程序内容视图的布局时,就会发生这种情况。
例如,请考虑以下代码,其中频繁创建和切换布局:
<code class="java">private void ConsoleWindow() { runOnUiThread(new Runnable() { @Override public void run() { // Create a new layout (LinearLayout). LinearLayout layout = new LinearLayout(getApplicationContext()); layout.setOrientation(LinearLayout.VERTICAL); // Add a TextView to the layout. layout.addView(tv); // Add an EditText to the layout. et.setHint("Enter Command"); layout.addView(et); // Set the content view to the new layout. setContentView(layout); } }); }</code>
当使用不同的布局调用 setContentView() 方法两次时就会出现问题。第一次没有问题,因为 LinearLayout 布局是第一次添加到内容视图中。但是,在后续调用 setContentView() 期间,LinearLayout 布局仍包含其子级(TextView 和 EditText)。由于 LinearLayout 对象已经有一个父对象(内容视图),再次添加它会抛出“指定的子对象已经有父对象”错误。
解决方案:
解决方案是在再次将其添加到内容视图之前,从 LinearLayout 布局中删除子级(TextView 和 EditText)。以下是修改后的代码:
<code class="java">private void ConsoleWindow() { runOnUiThread(new Runnable() { @Override public void run() { // Create a new layout (LinearLayout). LinearLayout layout = new LinearLayout(getApplicationContext()); layout.setOrientation(LinearLayout.VERTICAL); // Remove the TextView from its parent (if it has one). if (tv.getParent() != null) { ((ViewGroup) tv.getParent()).removeView(tv); } // Add the TextView to the layout. layout.addView(tv); // Remove the EditText from its parent (if it has one). if (et.getParent() != null) { ((ViewGroup) et.getParent()).removeView(et); } // Add the EditText to the layout. et.setHint("Enter Command"); layout.addView(et); // Set the content view to the new layout. setContentView(layout); } }); }</code>
通过在将子级添加到新的 LinearLayout 布局之前从其先前的父级中删除子级,可以确保它们不会同时附加到多个父级,从而解决了“指定的子级已有一个父母”错误。
以上是为什么我在 Android 中收到'指定的子项已经有父级”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!