我有一个不寻常的错误.我在自定义视图组中有这个.该方法接收一个视图并将其添加到布局,但我不断收到相同的错误:
if((ViewGroup)view.getParent() != null){
((ViewGroup)view.getParent()).removeView(view);
}
addView(view); <--- Breakpoints puts the error on this line
Run Code Online (Sandbox Code Playgroud)
错误是:
java.lang.IllegalStateException:指定的子级已有父级.您必须首先在孩子的父母上调用removeView().
在这周围使用断点显示,即使在父级上调用removeView之后,"查看"也会保留对其父级的引用.
有些人建议使用runnable在将其添加到视图之前等待几秒钟.我没有尝试过这个,因为它似乎更像是一个黑客而不是一个解决方案.无论哪种方式,我希望有人可以提供帮助
谢谢!
PS:不是它应该重要,但我添加的这个视图的父级是我制作的自定义网格布局,其父级是一个viewpager.
编辑:
我做了一些断点和调试,从它的外观来看,网格有效地从子列表中删除了视图(debug),但是子视图在其mParent变量(debug)中保持对同一网格的引用.这怎么可能
编辑:
在活动中:
Button button = new Button(mContext);
button.setOnClickListener(mClickListener);
(...)
Random random = new Random();
button.setText(random.nextInt(9999) + " ");
mCurrentGridLayout.addCustomView(button);
Run Code Online (Sandbox Code Playgroud)
在CustomGridLayout viewgroup类中:
public void addCustomView(View view){
if((ViewGroup)view.getParent() != null){
((ViewGroup)view.getParent()).removeView(view);
}
addView(view);
}
Run Code Online (Sandbox Code Playgroud)
在尝试创建自定义横幅时,我遇到了同样的问题.我相信这是因为布局过程中的动画,这就是延迟可以起作用的原因.在我的例子中,我创建了一个自定义的viewgroup类来消除动画延迟:
private class BannerLayout extends LinearLayout {
public BannerLayout(Context context) {
super(context);
}
@Override
protected void removeDetachedView(View child, boolean animate) {
super.removeDetachedView(child, false);
}
}
Run Code Online (Sandbox Code Playgroud)
一旦我这样做,一切都按预期工作.
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
4803 次 |
| 最近记录: |