我有一个异常错误。我有一个自定义视图组中。该方法接收一个视图并将其添加到布局中,但我一直收到相同的错误:
if((ViewGroup)view.getParent() != null){
((ViewGroup)view.getParent()).removeView(view);
}
addView(view); <--- Breakpoints puts the error on this line
错误是:
java.lang.IllegalStateException:指定的子代已经有一个父代。您必须先在孩子的父母上调用removeView()。
使用断点显示,即使在父级上调用removeView后,“ view”仍保留对其父级的引用。
[有人建议使用可运行对象等待几秒钟,然后再将其添加到视图中。我还没有尝试过,因为这似乎更像是一种破解,而不是解决方案。.无论哪种方式,我希望有人都能提供帮助
谢谢!
PS:没关系,但是我要添加的该视图的父级是我制作的自定义网格布局,其父级是viewpager。
编辑:
我做了更多的断点和调试,从其外观上,网格有效地从其子列表(调试)中删除了该视图,但是子视图在其mParent变量(调试)中保留了对该同一个网格的引用。这怎么可能
编辑:
活动中:
Button button = new Button(mContext);
button.setOnClickListener(mClickListener);
(...)
Random random = new Random();
button.setText(random.nextInt(9999) + " ");
mCurrentGridLayout.addCustomView(button);
在CustomGridLayout视图组类中:
public void addCustomView(View view){
if((ViewGroup)view.getParent() != null){
((ViewGroup)view.getParent()).removeView(view);
}
addView(view);
}
尝试创建自定义横幅时,我遇到了同样的问题。我认为这是由于布局过程中的动画,这就是延迟可能起作用的原因。就我而言,我创建了一个自定义视图组类以消除动画延迟:
private class BannerLayout extends LinearLayout {
public BannerLayout(Context context) {
super(context);
}
@Override
protected void removeDetachedView(View child, boolean animate) {
super.removeDetachedView(child, false);
}
}
一旦我这样做,一切都会按预期进行。
希望有帮助!
我遇到了同样的问题,Iree的回答确实帮助了我。原因是布局过渡的动画,但是如果我将其设置为null,我将丢失过渡动画。因此,我要做的是添加一个布局过渡侦听器,这样您可以在过渡完成后侦听该侦听器,然后将视图添加到其新父对象。
使用Java
LayoutTransition layoutTransition = ((ViewGroup)view.getParent()).getLayoutTransition();
layoutTransition.addTransitionListener(new TransitionListener(){
@Override
public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
// now you can add the same view to another parent
addView(view);
}
@Override
public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
}
});
使用Kotlin
val layoutTransition = (view.parent as ViewGroup).layoutTransition
layoutTransition.addTransitionListener(object : LayoutTransition.TransitionListener {
override fun startTransition(transition: LayoutTransition?,container: ViewGroup?,view: View?,transitionType: Int) {
addView(view)
}
override fun endTransition(transition: LayoutTransition?,container: ViewGroup?,view: View?,transitionType: Int) {
}
})