先调用孩子父母的removeView()

先来一点背景:

我有一个滚动视图内的布局。 首先,当用户在屏幕上滚动时,滚动视图滚动。 但是,经过一定量的滚动,我是禁用滚动视图上滚动“滚动焦点”到子视图内的web视图。 这样,滚动视图和所有的滚动事件进入它的web视图。

所以,对于一个解决scheme,当达到滚动阈值时,我从滚动视图中移除子布局,并把它放在滚动视图的父级(使滚动视图不可见)。

// Remove the child view from the scroll view scrollView.removeView(scrollChildLayout); // Get scroll view out of the way scrollView.setVisibility(View.GONE); // Put the child view into scrollview's parent view parentLayout.addView(scrollChildLayout); 

总体思路:( – >含义)

之前:parentlayout – > scrollview – > scrollChildLayout

之后:parentLayout – > scrollChildLayout

上面的代码给了我这个例外:

 java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. at android.view.ViewGroup.addViewInner(ViewGroup.java:1976) at android.view.ViewGroup.addView(ViewGroup.java:1871) at android.view.ViewGroup.addView(ViewGroup.java:1828) at android.view.ViewGroup.addView(ViewGroup.java:1808) 

你知道发生了什么事吗? 我清楚地调用父母的removeView。

解:

 ((ViewGroup)scrollChildLayout.getParent()).removeView(scrollChildLayout); //scrollView.removeView(scrollChildLayout); 

使用子元素获取对父项的引用。 将父项转换为ViewGroup,以便您可以访问removeView方法并使用该方法。

感谢@Dongshengcn提供的解决scheme

尝试从其父视图中删除scrollChildLayout第一?

 scrollview.removeView(scrollChildLayout) 

或从父视图中删除所有的孩子,并再次添加它们。

 scrollview.removeAllViews() 

在onCreate与活动或onCreateView与片段。

  if (view != null) { ViewGroup parent = (ViewGroup) view.getParent(); if (parent != null) { parent.removeView(view); } } try { view = inflater.inflate(R.layout.fragment_main, container, false); } catch (InflateException e) { } 

好吧,叫我偏执,但我build议:

  final android.view.ViewParent parent = view.getParent (); if (parent instanceof android.view.ViewManager) { final android.view.ViewManager viewManager = (android.view.ViewManager) parent; viewManager.removeView (view); } // if 

铸造没有instanceof只是似乎错了。 (谢谢IntelliJ IDEA告诉我) removeViewViewManager界面的一部分。 当一个完全合适的接口可用时,不应该投入具体的课程。

你所要做的就是post()一个可以执行addView()的Runnable。

你也可以通过检查如果View的indexOfView方法,如果indexOfView方法返回-1,那么我们可以使用它。

ViewGroup的detachViewFromParent(v); 然后是ViewGroup的removeDetachedView(v,true / false);

我正在调用parentView.removeView(childView)和childView仍然显示。 我终于意识到一个方法是以某种方式被触发两次,并将childView添加到父视图两次。

因此,使用parentView.getChildCount()来确定在添加视图之前以及之后的父节点有多less个子节点。 如果孩子被添加太多次,那么最上面的孩子正在被删除,副本childView保持 – 看起来像removeView正在工作,即使它是。

另外,您不应该使用View.GONE来删除视图。 如果它真的被删除,那么你将不需要隐藏它,否则它仍然存在,你只是从自己隐藏:(