开发者社区> 问答> 正文

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过一次,就会报错,请问是因为什么?有什么解决办法?

展开
收起
爵霸 2016-06-16 09:58:15 2528 0
1 条回答
写回答
取消 提交回答
  • 你可以去看看源码,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();
        }
    }
    2019-07-17 19:40:21
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
对象的生命期管理 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载