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);
相关推荐
虫小宝2 分钟前
导购APP高可用数据库设计:主从分离与分库分表在返利系统中的应用
android·数据库
Ccjf酷儿9 分钟前
C++语言程序设计 (郑莉)第三章 函数
开发语言·c++
独自破碎E11 分钟前
PO、VO、BO、DTO、DAO、POJO有什么区别?
java
czlczl2002092512 分钟前
从 SSO 登录到跨系统资源访问:OAuth2 全链路交互详解
java·spring boot·后端·spring·架构
茶本无香16 分钟前
单例模式深度解析:饿汉式与懒汉式的实现与选择
java·单例模式
爬山算法20 分钟前
Hibernate(29)什么是Hibernate的连接池?
java·后端·hibernate
ytttr87321 分钟前
基于人工蜂群算法(ABC)的MATLAB数值计算求解框架
开发语言·算法·matlab
Fuly102422 分钟前
软件研发类项目流程
java
我命由我1234523 分钟前
Android Jetpack Compose - TopAppBar、BottomAppBar、Scaffold
android·java·java-ee·kotlin·android studio·android jetpack·android-studio