RemoveView不起作用

问题描述 投票:6回答:2

我有一个异常错误。我有一个自定义视图组中。该方法接收一个视图并将其添加到布局中,但我一直收到相同的错误:

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);
}
android viewgroup
2个回答
10
投票

尝试创建自定义横幅时,我遇到了同样的问题。我认为这是由于布局过程中的动画,这就是延迟可能起作用的原因。就我而言,我创建了一个自定义视图组类以消除动画延迟:

private class BannerLayout extends LinearLayout {
  public BannerLayout(Context context) {
     super(context);
  }

  @Override
  protected void removeDetachedView(View child, boolean animate) {
     super.removeDetachedView(child, false);
  }
}

一旦我这样做,一切都会按预期进行。

希望有帮助!


0
投票

我遇到了同样的问题,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) {

      }
})
© www.soinside.com 2019 - 2024. All rights reserved.