您的位置:首页 > 编程语言 > Java开发

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView(

2017-05-29 22:43 946 查看

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child’s parent first.

指定的视图已经有一个父视图。你必须首先对视图的父视图removeview()。

本人是在使用for循环往LinearLayout里面动态加载TextView时,系统抛出这个异常的,找了下原因是因为 addView()进去的TextView没有重新的new出来,而原来的TextView已经被添加到LinearLayout中了,已经存在父视图了!!

源码:(通过编译工具点击addView()进入 ViewGroup类 一层层点 会看到此方法)

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();
}

dispatchViewAdded(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();
}

if (mTransientIndices != null) {
final int transientCount = mTransientIndices.size();
for (int i = 0; i < transientCount; ++i) {
final int oldIndex = mTransientIndices.get(i);
if (index <= oldIndex) {
mTransientIndices.set(i, oldIndex + 1);
}
}
}
}


关键代码:

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


可以看到 当child.getParent()!=null时 会抛出 我们碰到的异常因为我们添加的空间 已经有父布局了!!

PS:第一次发表博客,就把原来记的一个笔记总结下,发出来。还不是太会用,望见谅
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 移动开发
相关文章推荐