Android 开发问题:The specified child already has a parent.

  • 在 Android 开发中,应用运行时,报如下错误

    java.lang.IllegalStateException:
    The specified child already has a parent.
    You must call removeView() on the child's parent first.
    at android.view.ViewGroup.addViewInner(ViewGroup.java:5235)
    at android.view.ViewGroup.addView(ViewGroup.java:5064)
    at android.view.ViewGroup.addView(ViewGroup.java:5004)
    at android.view.ViewGroup.addView(ViewGroup.java:4976)
    ...

问题原因
复制代码
The specified child already has a parent.
  1. 错误信息表明试图将一个已经有父视图的子视图添加到另一个父视图中

  2. 在 Android 中,一个视图只能有一个父视图,不能同时属于多个父视图

问题复现
java 复制代码
ConstraintLayout main = findViewById(R.id.main);

TextView tvTest = new TextView(this);

tvTest.setText("test");

// 第 1 次添加,正常
main.addView(tvTest);

// 第 2 次添加,抛出异常
main.addView(tvTest);
复制代码
# 输出结果

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.view/com.my.view.ViewProblemActivity}: 
java.lang.IllegalStateException: 
The specified child already has a parent. 
You must call removeView() on the child's parent first.
处理策略
  • 在添加视图前,先检查它是否有父视图,如果有,先移除,然后再添加
java 复制代码
ConstraintLayout main = findViewById(R.id.main);

TextView tvTest = new TextView(this);

tvTest.setText("test");

// 第 1 次添加
if (tvTest.getParent() != null) {
    ViewGroup parent = (ViewGroup) tvTest.getParent();
    parent.removeView(tvTest);
}
main.addView(tvTest);

// 第 2 次添加
if (tvTest.getParent() != null) {
    ViewGroup parent = (ViewGroup) tvTest.getParent();
    parent.removeView(tvTest);
}
main.addView(tvTest);
相关推荐
beata12 分钟前
Java基础-18:Java开发中的常用设计模式:深入解析与实战应用
java·后端
Seven9741 分钟前
剑指offer-81、⼆叉搜索树的最近公共祖先
java
alexhilton11 小时前
端侧RAG实战指南
android·kotlin·android jetpack
雨中飘荡的记忆18 小时前
保证金系统入门到实战
java·后端
Nyarlathotep011319 小时前
Java内存模型
java
二流小码农19 小时前
鸿蒙开发:路由组件升级,支持页面一键创建
android·ios·harmonyos
xq952721 小时前
Android 手游SDK组件化开发实战指南
android
暮色妖娆丶1 天前
不过是吃了几年互联网红利罢了,我高估了自己
java·后端·面试
煤球王子1 天前
学习记录:Android14中的WiFi-wpa_supplicant(1)
android