先调用孩子父母的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告诉我) removeView
是ViewManager
界面的一部分。 当一个完全合适的接口可用时,不应该投入具体的课程。
你所要做的就是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来删除视图。 如果它真的被删除,那么你将不需要隐藏它,否则它仍然存在,你只是从自己隐藏:(