Primero un poco de historia:
Tengo un diseño dentro de una vista de desplazamiento. Al principio, cuando el usuario se desplaza en la pantalla, la vista de desplazamiento se desplaza. Sin embargo, después de una cierta cantidad de desplazamiento, debía deshabilitar el desplazamiento en la vista de desplazamiento y mover el "foco de desplazamiento" a una vista web dentro del diseño secundario. De esta manera, la vista de desplazamiento se pega y todos los eventos de desplazamiento van a la vista web dentro de ella.
Entonces, para una solución, cuando se alcanza el umbral de desplazamiento, elimino el diseño secundario de la vista de desplazamiento y lo pongo en el padre de la vista de desplazamiento (y hago que la vista de desplazamiento sea invisible).
// 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);
Idea general: (-> medios contiene)
Antes: parentlayout -> scrollview -> scrollChildLayout
Después: parentLayout -> scrollChildLayout
El código anterior me está dando esta excepción:
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)
¿Sabes lo que está pasando? Claramente estoy llamando a removeView en el padre.
fuente
scrollView.removeView(scrollChildLayout)
intenta eliminar el elemento secundario de scrollView, no eliminar el scrollView en sí de su ViewGroup principalif (mAdView.getParent()!=null) ((ViewGroup) mAdView.getParent()).removeView(mAdView);
Intente eliminar scrollChildLayout de su vista principal primero?
O elimine todo el elemento secundario de la vista principal y agréguelos nuevamente.
fuente
En onCreate con actividad o en onCreateView con fragmento.
fuente
Ok, llámame paranoico pero te sugiero:
lanzar sin
instanceof
solo parece estar mal. Y (gracias IntelliJ IDEA por decirme)removeView
es parte de laViewManager
interfaz. Y no se debe lanzar a una clase concreta cuando hay disponible una interfaz perfectamente adecuada.fuente
Todo lo que tienes que hacer es publicar () un Runnable que haga addView ().
fuente
Estaba llamando a parentView.removeView (childView) y aún se mostraba childView. Eventualmente me di cuenta de que de alguna manera se estaba activando un método dos veces y agregué childView a parentView dos veces.
Por lo tanto, use parentView.getChildCount () para determinar cuántos hijos tiene el padre antes de agregar una vista y después. Si el elemento secundario se agrega demasiadas veces, se eliminará el elemento superior de la parte superior y la copia childView permanecerá, lo que parece que removeView funciona incluso cuando lo está.
Además, no debe usar View.GONE para eliminar una vista. Si realmente se elimina, entonces no necesitará ocultarlo, de lo contrario, todavía está allí y solo se lo está ocultando a usted mismo :(
fuente
En mi caso, tengo BaseFragment y todos los demás fragmentos heredan de esto.
Entonces mi solución fue agregar estas líneas en el
OnDestroyView()
métodofuente
Solución Kotlin
Kotlin simplifica la conversión principal con
as?
, devolviendo nulo si el lado izquierdo es nulo o falla la conversión .Solución de extensión Kotlin
Si desea simplificar esto aún más, puede agregar esta extensión.
No hará nada con seguridad si esta Vista es nula, la vista primaria es nula o la vista primaria no es un ViewGroup
fuente
También puede hacerlo verificando si el método indexOfView de View si el método indexOfView devuelve -1, entonces podemos usarlo.
DetachViewFromParent (v) de ViewGroup; seguido por removeDetachedView de ViewGroup (v, verdadero / falso);
fuente
Lo que estaba haciendo mal, así que obtuve este error es que no estaba creando instancias de diseño dinámico y agregando hijos, así que obtuve este error
fuente
Aquí está mi solución.
Digamos que tienes dos
TextViews
y ponlos en unLinearLayout
(nombradoll
). Pondrás estoLinerLayout
en otroLinerLayout
.Cuando desee crear esta estructura, debe dar a los padres como herencia.
Si quieres usarlo en un
onCreate
métodothis
será suficiente.De lo contrario, aquí está la solución:
fuente