- 在 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.
错误信息表明试图将一个已经有父视图的子视图添加到另一个父视图中
在 Android 中,一个视图只能有一个父视图,不能同时属于多个父视图
问题复现
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.
处理策略
- 在添加视图前,先检查它是否有父视图,如果有,先移除,然后再添加
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);