android-addView同一个对象两次会出错

问题描述

addView同一个对象两次会出错
        //首页按钮
        ImageView home=new ImageView(context);
        home.setImageResource(R.drawable.icon_03);
        home.setLayoutParams(iconparams);
        home.setPadding(10, 10, 10, 10);
        addView(home);

        //分隔符
        ImageView seprator = new ImageView(context);
        seprator.setImageResource(R.drawable.seprator_03);
        seprator.setLayoutParams(sepratorparams);
        addView(seprator);

        //2
        ImageView icon2=new ImageView(context);
        icon2.setImageResource(R.drawable.icon_05);
        icon2.setLayoutParams(iconparams);
        icon2.setPadding(10, 10, 10, 10);
        addView(icon2);
        addView(seprator);

上边是我在android项目中写的一个用户控件的部分代码,调试后发现再第二次addView(seprator);时候会报错,然后我试了一下其他的,结果是只要是第二次addView的参数对象之前已经addView过一次,就会报错,请问是因为什么?有什么解决办法?

解决方案

你可以去看看源码,ViewGroup→addView()→addViewInner()中

private void addViewInner(View child, int index, LayoutParams params,
boolean preventRequestLayout) {

    if (mTransition != null) {
        // Don't prevent other add transitions from completing, but cancel remove
        // transitions to let them complete the process before we add to the container
        mTransition.cancel(LayoutTransition.DISAPPEARING);
    }

    if (child.getParent() != null) {
        throw new IllegalStateException("The specified child already has a parent. " +
                "You must call removeView() on the child's parent first.");
    }

    if (mTransition != null) {
        mTransition.addChild(this, child);
    }

    if (!checkLayoutParams(params)) {
        params = generateLayoutParams(params);
    }

    if (preventRequestLayout) {
        child.mLayoutParams = params;
    } else {
        child.setLayoutParams(params);
    }

    if (index < 0) {
        index = mChildrenCount;
    }

    addInArray(child, index);

    // tell our children
    if (preventRequestLayout) {
        child.assignParent(this);
    } else {
        child.mParent = this;
    }

    if (child.hasFocus()) {
        requestChildFocus(child, child.findFocus());
    }

    AttachInfo ai = mAttachInfo;
    if (ai != null && (mGroupFlags & FLAG_PREVENT_DISPATCH_ATTACHED_TO_WINDOW) == 0) {
        boolean lastKeepOn = ai.mKeepScreenOn;
        ai.mKeepScreenOn = false;
        child.dispatchAttachedToWindow(mAttachInfo, (mViewFlags&VISIBILITY_MASK));
        if (ai.mKeepScreenOn) {
            needGlobalAttributesUpdate(true);
        }
        ai.mKeepScreenOn = lastKeepOn;
    }

    if (child.isLayoutDirectionInherited()) {
        child.resetRtlProperties();
    }

    onViewAdded(child);

    if ((child.mViewFlags & DUPLICATE_PARENT_STATE) == DUPLICATE_PARENT_STATE) {
        mGroupFlags |= FLAG_NOTIFY_CHILDREN_ON_DRAWABLE_STATE_CHANGE;
    }

    if (child.hasTransientState()) {
        childHasTransientStateChanged(child, true);
    }

    if (child.getVisibility() != View.GONE) {
        notifySubtreeAccessibilityStateChangedIfNeeded();
    }
}




解决方案二:

没错,因为它已经有parent了,你要先removeallviews,然后再添加

解决方案三:

同一个对象添加两次当然会崩溃了,会提示已经有父view

如果你想添加两次都构造两个seperator对象!!!new 两次就可以了

解决方案四:

每次都有new一个新的view来add

解决方案五:

已经存在的view 具有一个parent,会报错的。或者你需要移除他的parentView

解决方案六:

这个问题前面几位已经回答很详细了。我的建议:遇到奇怪的问题,如API文档中没有找到原因。这个时候就应该看看源代码了。

时间: 2024-07-29 04:02:17

android-addView同一个对象两次会出错的相关文章

Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍_Android

Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写

Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍

Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写

Android线程操作对象AsyncTask线程机制

 简单的说,一个程序只有一个主线程,可以有多个主线程.在Android世界中也是这样,Android属于单线程模型,耗时操作必须放在非主线程中执行,故而谷歌为了方便我们使用线程,为我们提供一个AsyncTask多线程操作对象.   对于Android使用线程还有一点需要特别注意,哪就是Android不允许在子线程中更新UI,相信很多初学者一定遇到过这个问题,这个怎么解决呢?在Activity中,我们可以通过   new Thread(new Runnable() { @Override publ

eclipse打开android项目下layout的.xml文件出错

问题描述 eclipse打开android项目下layout的.xml文件出错 报错为:An error has occurred. See error log for more details. java.lang.NullPointerException,今天不知突然怎么出现这种情况了以前都好好的 解决方案 Eclipse中Android项目XML文件的格式化配置Eclipse中Android项目XML文件的格式化配置Eclipse中Android项目XML文件的格式化配置 解决方案二: 肯

android fastjson转对象报错

问题描述 android fastjson转对象报错 我现在做了一个App,出现了一个问题,在我使用了混淆后,签名发布程序就是出错.其中,如果只混淆可以正常使用,一签名就不对了,但如果不做混淆只签名发布,也可以正确使用.经过多次反复测试发现,如果混淆后再签名发布,json转对象就有一点问题,具体就是json转对象(我使用fastjson)只能转第一层级,更多的嵌套子对象字符串不能转.{"fromLinkName":"张山","fromLinkTel&quo

java,android中intent对象和bundle对象有和区别?

问题描述 java,android中intent对象和bundle对象有和区别? android中intent对象和bundle对象有和区别?这两个对象都存在吗?有什么用的,传递数据吗还是怎么 的 解决方案 intent内部就是用bundle存储的 解决方案二: http://m.blog.csdn.net/blog/na604365019/8042977 解决方案三: android 中bundle对象

多线程-我这样是否对同一个对象进行了排序(小猿一只,评论勿留情)

问题描述 我这样是否对同一个对象进行了排序(小猿一只,评论勿留情) import java.util.Random; public class MergeSort implements Runnable{ public void run() { int[] a = new int[100000]; Random p = new Random(); //产生随机数 for(int i=0;i<100000;i++) a[i] = p.nextInt(10000); //计时 //long star

为什么e和c指向的不是同一个对象??请高手做出解释,谢谢。。

问题描述 publicclassStringTest{publicstaticvoidmain(String[]args){Stringa="ab";System.out.println("Stringa="ab";");Stringb="cd";System.out.println("Stringb="cd";");Stringc="abcd";Stringd=&q

java制作计算器的时候同时输入两个运算符出错

问题描述 java制作计算器的时候同时输入两个运算符出错 按照慕课网一步一步做的,但是做完之后存在一个问题,就是如果已经输入了一个运算符号,继续输入一个运算符号,后输入的那一个并不会将原来的那个符号覆盖,所以就会运算出错.请问有什么方法解决?(我尝试通过if判断是否已经输入了运算符,如果已经输入,就把原来的截去之后再写入新的运算符,但是没有效果) package com.example.calculator; import android.app.Activity; import android