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.
- ¿Cómo cambiar el tamaño del contenido de una webview en android?
- Eliminar la pista de la barra de desplazamiento de ScrollView en Android
- Evento de desplazamiento para recyclerview inside scrollview android
- ¿Cómo implementar desplazamiento horizontal para la barra de herramientas en android?
- Cómo configurar el color de un borde de desvanecimiento Android ScrollView?
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.
- ImageView no llenará el padre
- No estirar ScrollView
- ¿Cómo puedo obtener una función de paginación en vista de desplazamiento horizontal sin ViewPager?
- Vista ScrollView con niños, cómo interceptar desplazamiento condicional
- ¿Cómo puedo hacer que mi cuadro de diálogo de Android sea de pantalla completa?
- ¿Por qué no android: windowSoftInputMode = "stateVisible | adjustResize" ajustar la pantalla cuando se muestra el teclado virtual?
- Scrolling jerky antes de frenar cuando edittext solo dentro de scrollview
- Pestañas de Acción
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 🙁
- ¿Por qué usar el código armeabi-v7a sobre el código armeabi?
- Recyclerview y manejo de diferentes tipos de hilera de inflación