RemoveView无法正常工作

nun*_*123 5 android viewgroup

我有一个不寻常的错误.我在自定义视图组中有这个.该方法接收一个视图并将其添加到布局,但我不断收到相同的错误:

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)

Ire*_*ree 9

在尝试创建自定义横幅时,我遇到了同样的问题.我相信这是因为布局过程中的动画,这就是延迟可以起作用的原因.在我的例子中,我创建了一个自定义的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)

一旦我这样做,一切都按预期工作.

希望能帮助到你!

  • 在不创建子类的情况下消除动画的另一种方法是将父布局的**布局转换**设置为**null**类似于:`parentView.setLayoutTransition(null); parentView.removeView(视图);` (4认同)