所以我有这样的代码:
((LinearLayout) view.getParent()).removeView(view);
container.addView(view);
现在,如果我错了,请更正我,但该代码应该从当前ViewGroup
中删除该视图,然后将其添加到新的ViewGroup
但是,引发了以下exception
:
E/AndroidRuntime(31220): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
有关为何会发生这种情况的任何想法吗?
编辑:这只发生在父:XML标签中将android:animateLayoutChanges设置为true时
答案 0 :(得分:4)
它不起作用可能是因为View有mParent字段,它没有通过调用它的父节点上的removeView()来重置。
相反,它可能更好地给新视图充气。
编辑现在你已经说过layoutTransition了,你可以尝试从ViewParent中移除layoutTransition,同时删除它。从来没有尝试过。
final ViewGroup parent = (ViewGroup) view.getParent();
final LayoutTransition transition = parent.getLayoutTransition();
parent.setLayoutTransition(null);
parent.removeView(view);
parent.setLayoutTransition(transition);
newParent.addView(view);
答案 1 :(得分:0)
您应该尝试将其投射到ViewGroup:
((ViewGroup) childView.getParent()).removeView(childView);
答案 2 :(得分:0)
解决:
由于动画,在动画完成之前,视图实际上并未移除,大约需要300毫秒
所以这样的事情应该可以正常工作(350毫秒计时器只是为了确保动画完成):
((ViewGroup) view.getParent()).removeView(view);
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
public void run() {
container.addView(view);
}
}, 350);