【发布时间】:2014-04-06 02:35:17
【问题描述】:
我遇到了一个不寻常的错误。我在自定义视图组中有这个。该方法接收一个视图并将其添加到布局中,但我不断收到相同的错误:
if((ViewGroup)view.getParent() != null){
((ViewGroup)view.getParent()).removeView(view);
}
addView(view); <--- Breakpoints puts the error on this line
错误是:
java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()。
在此周围使用断点表明“视图”即使在父级上调用 removeView 后仍保留对其父级的引用..
有些人建议使用 runnable 等待几秒钟,然后再将其添加到视图中。我没有尝试过,因为它似乎更像是一种黑客攻击而不是解决方案。无论哪种方式,我都希望有人能够提供帮助
谢谢!
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);
}
【问题讨论】:
-
您确定正在调用 removeView 吗?这是在哪个班?为什么第一种情况你必须使用
getParent()方法,而第二种情况你只是调用addView()? -
因为网格不同。我在两个网格之间移动子视图,这是我在网格内调用以将视图从一个网格移动到另一个网格的方法是的,正在调用删除视图
-
view是如何声明的,代码是什么? -
不确定这是否会有所帮助,但您是否尝试在添加之前致电
view.invalidate()?但是您正在发送一个新创建的View(来自您发布的代码),因此它没有父级。 -
我在几个地方调用 addCustomView .. 在子视图点击事件、长点击事件等