问题说明:

    View 在多次调用view.getParent().removeView(view);  之后,调用ViewGroup.addView(view )  程序崩溃。

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

跟踪ViewGroup.removeView() 我们发现, 最终会调用到这个位置:

private void removeFromArray(int index) {
        final View[] children = mChildren;
        if (!(mTransitioningViews != null && mTransitioningViews.contains(children[index]))) {
            children[index].mParent = null;
        }

因为被移除的视图在mTransitioningViews中,(正在执行移除动画)因此没有将他的parent 设置为空。 然后导致添加view 的时候,崩溃了。

通过分析,找到了导致问题的原因。

public void startViewTransition(View view) {
        if (view.mParent == this) {
            if (mTransitioningViews == null) {
                mTransitioningViews = new ArrayList<View>();
            }
            mTransitioningViews.add(view);
        }
    }
03-13 05:18