关于异常“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掉了嘛。

代码如下:

相关文章
|
Web App开发 API 开发者
关于 SAP UI5 Context.prototype.delete 方法的输入参数 Group ID 的细节
关于 SAP UI5 Context.prototype.delete 方法的输入参数 Group ID 的细节
|
JavaScript
热点面试题:JS 中 call, apply, bind 概念、用法、区别及实现?
热点面试题:JS 中 call, apply, bind 概念、用法、区别及实现?
|
前端开发
前端学习案例1-empty和undefined区别
前端学习案例1-empty和undefined区别
84 0
前端学习案例1-empty和undefined区别
|
编解码
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操作的区别?
99 0
|
Go
Go Error 嵌套到底是怎么实现的?
Go Error 嵌套到底是怎么实现的?
136 0
Go Error 嵌套到底是怎么实现的?
|
JavaScript
SAP Spartacus cx-page-layout 属性运行时的赋值原理, set 是如何被框架调用的?
SAP Spartacus cx-page-layout 属性运行时的赋值原理, set 是如何被框架调用的?
SAP Spartacus cx-page-layout 属性运行时的赋值原理, set 是如何被框架调用的?
|
前端开发 JavaScript
一个简单的例子让你轻松地明白JavaScript中apply、call、bind三者的用法及区别
这篇文章也算是讲解了前端面试 常考的知识点 ,即关于JavaScript中apply、call、bind三者的用法及区别。 如果有些小伙伴已经对该知识有一定的了解了,可以直接跳到最后看 总结
128 0
|
JavaScript
SAP Spartacus cost center list class的赋值逻辑
SAP Spartacus cost center list class的赋值逻辑
SAP Spartacus cost center list class的赋值逻辑