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);
相关推荐
Mr.Jessy1 小时前
JavaScript高级:构造函数与原型
开发语言·前端·javascript·学习·ecmascript
云栖梦泽3 小时前
鸿蒙应用签名与上架全流程:从开发完成到用户手中
开发语言·鸿蒙系统
爱上妖精的尾巴4 小时前
6-4 WPS JS宏 不重复随机取值应用
开发语言·前端·javascript
Goldn.4 小时前
Java核心技术栈全景解析:从Web开发到AI融合
java· spring boot· 微服务· ai· jvm· maven· hibernate
李慕婉学姐5 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
小鸡吃米…5 小时前
Python 列表
开发语言·python
m0_740043735 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
编织幻境的妖5 小时前
SQL查询连续登录用户方法详解
java·数据库·sql
kaikaile19956 小时前
基于C#实现一维码和二维码打印程序
开发语言·c#
我不是程序猿儿6 小时前
【C#】画图控件的FormsPlot中的Refresh功能调用消耗时间不一致缘由
开发语言·c#