关于报错The specified child already has a parent的解决办法

报错信息为:java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child‘s parent first.

首先,如果你看到这篇文章,说明你已经搜了很多篇了(首页可能字数都不够,但是又不甘心收获不能普度众生……),所以我想声明一下,你一定不要抱着直接找到源码解决问题的想法,要找方法,发现问题解决问题的方法!

好了,正如报错信息提示的,说明你现在要操作的这个View已经有了一个父View,所以你要找是不是那个地方,比如创建这个View时,调用了addView的方法等等,使它有了一个不知名的父类(只是你不知道而已)

这种问题普遍出现在动态添加View时,会出现。比如,有些项目把某一个控件如LinearLayout等,弄出来当作全局变量了,以便在其他地方直接调用addView进行动态添加,注意如果你在声明LinearLayout 时,试着紧跟着它动态添加一个view,没问题——那说明全局调用也绝对能用!所以,问题一定出在你创建自己定义的View时调用了addView等等别的方法,使得其有了父类,抑或是其本来就有父类,你不注意,所以自然要报错。

  比如一下就是从网上直接拷来的自定义View的模板

public class CustomView extends RelativeLayout{
        View mView=null;
    public Weather(Context context) {
        super(context);
        LayoutInflater mInflater = LayoutInflater.from(context);
        mView = mInflater.inflate(R.layout.weather, null);
        addView(mView);
    }

你要是使用这个自定义控件肯定不能通过addView添加到其他的布局中去,会报如题的错误,因为它已经有父类了(代码中addView(myView);使它有了父类,虽然没人知道其父类是谁~),所以必须要注释掉addView(myView);这个CustomView才是一个独立的View。

时间: 2024-08-30 05:50:11

关于报错The specified child already has a parent的解决办法的相关文章

替换Fragment 报错 The specified child already has a parent. You must call removeView() on the child's parent first.

在将一个fragment替换到一个frameLayout的时候报错: code: transaction.replace(R.id.fragment_container, fragment2); 错误:  java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 原因: @Override  

linux centos环境下,perl使用DBD::Oracle遇到报错Can't locate DBDOracle.pm in @INC 的解决办法

前言 接手前辈的项目,没有接触.安装.使用过perl和DBD::Oracle,也没有相关的文档记录,茫茫然不知所措~~.一开始发现这个问题,就想着迅速解决,就直接在google上搜报错信息,搜索的过程中发现 如果不搞清楚前因后果我连解决方案都'看不见''看不懂'. 所以还是要补充这方面的知识,再思考解决方案.以下内容就是我一边学习一边解决问题的过程,如果不足,请各位大佬指出. 报错 install_driver(Oracle) failed: Can't locate DBD/Oracle.pm

VUE.JS 使用axios数据请求时数据绑定时 报错 TypeError: Cannot set property 'xxxx' of undefined 的解决办法

正常情况下在data里面都有做了定义 在函数里面进行赋值 这时候你运行时会发现,数据可以请求到,但是会报错 TypeError: Cannot set property 'listgroup' of undefined 主要原因是: 在 then的内部不能使用Vue的实例化的this, 因为在内部 this 没有被绑定.可以看下 Stackoverflow 的解释: 解决办法: 1.用ES6箭头函数,箭头方法可以和父方法共享变量 2.在请求axios外面定义一下 var that=this 问题

使用webpack命令打包时,报错TypeError: Cannot read property 'presetToOptions' of undefined的解决办法

我只安装了webpack,没有安装webpack-cli,第一次输入webpack打包时,提示 One CLI for webpack must be installed. These are recommended choices, delivered as separate packages: - webpack-cli (https://github.com/webpack/webpack-cli) The original webpack full-featured CLI. We wi

VUE - 使用axios数据请求时数据绑定时 报错 TypeError: Cannot set property 'xxxx' of undefined 的解决办法

created() { var that=this axios.get('http://jsonplaceholder.typicode.com/todos') .then(function (res) { // handle success // console.log(res); that.todos = res.data }) .catch(function (error) { // handle error console.log(error); }) .finally(function

VS Code报错Module 'xx' has no 'xx' member pylint(no-member)解决办法

pylint是vscode的python语法检查器,pylint是静态检查,在用第三方库的时候有些成员只有在运行代码的时候才会被建立,它就找不到成员,在设置(settings.json)里添加 "python.linting.pylintArgs": ["--generate-members"]来避免报错 VS Code报错Module 'xx' has no 'xx' member pylint(no-member)解决办法 原文地址:https://www.cn

启动Myeclipse报错“Failed to create the Java Virtual Machine”的解决办法

我安装的是Myeclipse 10.7.1.装上好久没用,今天启动突然报错:Failed to create the Java Virtual Machine. 检查Myeclipse安装好使用时好的啊,近期也没用,可能是近期升级了本地单独安装的jre版本导致的吧(Myeclipse使用自己的jre的). 整理了如下2个解决办法,可以选择一个使用,我选择的是第2个.经测试都ok. 方法一: 找到Myeclpise路径下的myeclipse.ini文件: 编辑将Xmx(JVM Heap最大允许的尺

Oracle SQL Developer报错:Unable to find a Java Virtual Machine解决办法

安装了64位的Oracle数据库以及32位的Oracle客户端,在开始菜单中第一次打开客户端的SQL Developer时提示输入java.exe的路径,我选择了Oracle数据库自带的jdk路径,确定之后报错: 百度查找解决办法,原因是64位的Oracle数据库中自带的jdk也是64位的,但安装的Oracle客户端是32位的,所以不兼容. 解决办法一般有两种做法: 1)从网上下载Oracle SQL Developer x64(http://www.oracle.com/technetwork

小程序报错:出现脚本错误或者未正确调用 Page()的解决办法

场景是两个人共同开发小程序,我使用的是pc端,另一个同事是用的mac端,我这边能够正常运行项目,代码提交到git,同事check下来发现运行报错: 出现脚本错误或者未正确调用 Page(); 如图 一脸懵逼,在这里也吐槽一下开发工具,报这种错误你让我去哪找问题,感觉就是老虎吃天无从下口,上网搜索全是让我在每个index.js下面加上Page({})这个字段,但是现在微信开发工具已经会默认在每个页面的js文件里面加上Page({})的好吗,几番搜索无果后遂放弃挣扎, 也不知道是不是平时有烧高香的习