Llame a removeView () en el padre del niño primero

Primero un poco de fondo:

Tengo un diseño dentro de un scrollview. 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, mover el "enfoque de desplazamiento" a una vista web dentro del diseño secundario. De esta manera, los palos scrollview y todos los eventos de desplazamiento van a la vista web dentro de él.

Por lo tanto, 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 scrollview. (Y hacer 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: (-> significa 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? Estoy claramente llamando a removeView en el padre.

Solución:

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

Utilice el elemento secundario para obtener una referencia al padre. Asigne el padre a un ViewGroup para que tenga acceso al método removeView y utilice eso.

Gracias a @Dongshengcn por la solución

¿Desea eliminar primero scrollChildLayout de su vista principal?

 scrollview.removeView(scrollChildLayout) 

O elimine todo el niño de la vista principal y agréguelo de nuevo.

 scrollview.removeAllViews() 

En onCreate con actividad o en onCreateView con fragmento.

  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) { } 

Ok, llámame paranoico pero te sugiero:

  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 

Casting sin instanceof sólo parece mal. Y (gracias IntelliJ IDEA por decirme) removeView es parte de la interfaz de ViewManager . Y uno no debe lanzar a una clase concreta cuando una interfaz perfectamente adecuada está disponible.

Todo lo que tienes que hacer es publicar () un Runnable que hace el addView ().

También puede hacerlo comprobando si el método indexOfView de View si el método indexOfView devuelve -1, entonces podemos usarlo.

DetachViewFromParent de ViewGroup (v); Seguido por ViewGroup removeDetachedView (v, true / false);

Estaba llamando a parentView.removeView (childView) y childView seguía mostrando. Finalmente me di cuenta de que un método fue de alguna manera disparado dos veces y agregó el childView a la 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 niño se agrega demasiadas veces, entonces se elimina a la mayor parte de los niños y se mantiene la copia childView, que parece que removeView funciona incluso cuando está.

Además, no debe utilizar View.GONE para eliminar una vista. Si realmente se elimina, entonces no necesitará ocultarlo, de lo contrario todavía está ahí y solo lo escondes de ti mismo 🙁

  • ListView dentro de un ScrollView
  • Mantener la posición de desplazamiento ScrollView para contenido dinámico
  • Android ScrollView scrollTo () método no funciona con TextView?
  • Android: ¿Vista de lista horizontal en la vista de desplazamiento vertical?
  • Android, Horizontal y Vertical Scroll para GridLayout
  • DialogFragment sin título - ScrollView no se desplaza
  • ScrollView dentro de la Galería, desplazándose independientemente
  • Android TimePicker (Estilo de rueda) no responde correctamente a los gestos de desplazamiento dentro de ScrollView
  • Scrollview con paginación en android
  • ListView dentro de ScrollView con DrawerLayout
  • Scrollview dentro de un fragmento de viewpager no se desplaza cuando se muestra el teclado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.