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

代码如下:

相关文章
|
3月前
|
JavaScript 前端开发 C++
如何理解 QML_ELEMENT QML_SINGLETON staic Foo *create(QQmlEngine *, QJSEngine *){return s instance; }
如何理解 QML_ELEMENT QML_SINGLETON staic Foo *create(QQmlEngine *, QJSEngine *){return s instance; }
53 2
|
编译器 Linux 调度
RT-Thread编程高阶用法-函数扩展之$Sub$与$Super$
RT-Thread编程高阶用法-函数扩展之$Sub$与$Super$
121 0
|
编解码
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操作的区别?
101 0
|
JavaScript 前端开发 API
如何解决0.1 +0.2===0.30000000000000004类问题
如何解决0.1 +0.2===0.30000000000000004类问题
如何解决0.1 +0.2===0.30000000000000004类问题
php:类中的static、final、const、parent、self、$this关键字使用方法和区别
php:类中的static、final、const、parent、self、$this关键字使用方法和区别
116 0
C#基础知识学习之 ✨ 委托的兄弟姐妹们 delegate、Action、Func、Predicate
委托 delegate、Action、Func、Predicate 简单介绍 delegate、Action、Func、Predicate 几种基础的委托结构 几种委托的实例用法 开始分析 delegate使用 Action的用法 Func的用法 简单总结
C#基础知识学习之 ✨ 委托的兄弟姐妹们 delegate、Action、Func、Predicate
|
Kotlin
【错误记录】布局组件加载错误 ( Attempt to invoke virtual method ‘xxx$Callback android.view.Window.getCallback()‘ )
【错误记录】布局组件加载错误 ( Attempt to invoke virtual method ‘xxx$Callback android.view.Window.getCallback()‘ )
315 0
|
前端开发
前端常见bug系列1:容易被误解的:last-child 和 :first-child
用某个选择器过滤出来一个元素集合,当我们想选中最后一个元素的时候,是不是很容易想到:last-child?比如,有下面一段CSS和HTML片段: ``` .section{ margin-bottom: 50px; } .section1-item:last-child{ col
3146 0