关于异常“The specified child already has a parent. You must call removeView"的解决(举例说明,附源码)

简介: 在android开发过程中,有时会在不同情况下遇到同种问题: java.lang.IllegalStateException The specified child already has a parent. You must call removeView() on the child's parent first.也就是非法状态异常,它说这个特定的child已经有一个parent了,你必须在这个parent中首先调用removeView()方法,才能继续你的内容。

android开发过程中,有时会在不同情况下遇到同种问题:

 java.lang.IllegalStateException The specified child already has a parent. You must call removeView() on the child's parent first.
也就是非法状态异常,它说这个特定的 child 已经有一个 parent 了,你必须在这个 parent 中首先调用 removeView() 方法,才能继续你的内容。这里很明显这个 child 是一个 View ,一个子( child View 必须依赖于父( parent View ,如果你要使用这个 child ,则必须通过 parent ,而你如果就是硬想使用这个 child ,那么就得让这个 child parent 脱离父子关系(即 removeView ())……算了还是举个简单的例子来说明一下,省的我说的乱七八糟,你听的也晕。

新建一个项目,布局文件中仅包含一个TextView和一个ImageView,布局方式是线性布局(具体可以参考后面的源代码),运行的结果就是显示一个文本和一张图片,

ActivityonCreate()方法中,我们通常使用以下这种方式来使用布局文件main.xml

setContentView(R.layout.main);

这里为了解释今天要讲解的这个异常,换一种布局文件的使用方式,即把上面的那一行代码注释掉,换成以下代码:

//获取Infalter对象

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
LinearLayout parent = (LinearLayout) inflater.inflate(R.layout.main, null);
ImageView child = (ImageView)parent.findViewById(R.id.child);        
setContentView(parent);

LayoutInflater 为布局填充类,不明白的可以自己查,或者有机会我将在博客中介绍一下,然后是将 main.xml 文件 inflate LinearLayout 文件,再得到 child ,即 ImageView 。然后就是通过调用 setContentView(parent) 将这个布局 main.xml 显示出来,这时得到的效果和仅使用 setContentView(R.layout.main) 这句代码得到的效果一样。

下面的操作将会出现异常了,大家注意:

setContentView(child);
也就是将上文setContentView(parent) ,中的 parent 换成 child 。异常请看如下截图:


而这时在异常中它提示要再parent中调用removeView()。这里我们就听从指挥,在setContentView(child),之前添上一句parent.removeView(child),这时就不会再调用setContentView(child)就不会异常了,当然当前显示的将只是一幅图片了,而这时如果你调用setContentView(parent)的话将只显示文本内容,因为我们已经将child remove掉了嘛。

代码如下:

相关文章
|
27天前
|
JavaScript 前端开发
js开发:请解释什么是事件委托(event delegation),并给出一个示例。
事件委托是JavaScript中优化事件处理的技术,通过绑定事件处理器到共享的父元素,利用事件冒泡机制来处理子元素的事件。这种方法能提升性能、简化代码并降低内存消耗。示例展示了如何在父元素上监听`click`事件,然后通过`event.target`识别触发事件的具体子元素(如`<li>`),实现对动态生成列表项的点击事件处理。
|
1月前
|
JavaScript
JS中call()、apply()、bind()改变this指向的原理
JS中call()、apply()、bind()改变this指向的原理
|
8月前
|
JavaScript
热点面试题:JS 中 call, apply, bind 概念、用法、区别及实现?
热点面试题:JS 中 call, apply, bind 概念、用法、区别及实现?
|
前端开发
前端小案例1-call和apply的重写1 原
前端小案例1-call和apply的重写1 原
55 0
前端小案例1-call和apply的重写1 原
|
编解码
wrf模式学习记录--如何计算三层嵌套中的e_sn/e_we/ i_parent_start/ j_parent_start
在此记录一下关于wrf模式中如何计算嵌套网格的格点数,即e_sn / e_we
wrf模式学习记录--如何计算三层嵌套中的e_sn/e_we/ i_parent_start/ j_parent_start
|
JavaScript 前端开发 Shell
在child_process域和错误的冒泡和捕获实践【Note.js】
在child_process域和错误的冒泡和捕获实践【Note.js】
|
编译器
新年第一问,请解释一下extend和super泛型中list操作的区别?
新年第一问,请解释一下extend和super泛型中list操作的区别?
70 0
|
JavaScript
2022前端面经---改变this指向问题(call、apply、bind)
2022前端面经---改变this指向问题(call、apply、bind)
|
测试技术
软件测试面试题:page object设置模式中,是否需要在page里定位的方法中加上断言?
软件测试面试题:page object设置模式中,是否需要在page里定位的方法中加上断言?
98 0
|
前端开发 JavaScript
一个简单的例子让你轻松地明白JavaScript中apply、call、bind三者的用法及区别
这篇文章也算是讲解了前端面试 常考的知识点 ,即关于JavaScript中apply、call、bind三者的用法及区别。 如果有些小伙伴已经对该知识有一定的了解了,可以直接跳到最后看 总结
101 0