From caa4700487fa9c56a409e59f5758ae4147ec7362 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Tue, 25 Mar 2025 19:55:31 +0100 Subject: [PATCH] ViewGroup: keep track of detachedChildren Some ViewGroups like ViewPager2 call attachViewToParent() without calling detachViewFromParent() first. This is not allowed according to the Android API spec, but we need to handle it. --- src/api-impl/android/view/ViewGroup.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/api-impl/android/view/ViewGroup.java b/src/api-impl/android/view/ViewGroup.java index 47bd3661..b8defa1d 100644 --- a/src/api-impl/android/view/ViewGroup.java +++ b/src/api-impl/android/view/ViewGroup.java @@ -15,6 +15,7 @@ import java.util.Objects; public class ViewGroup extends View implements ViewParent, ViewManager { public ArrayList children; + private ArrayList detachedChildren; private OnHierarchyChangeListener onHierarchyChangeListener; private LayoutTransition transition; @@ -34,6 +35,7 @@ public class ViewGroup extends View implements ViewParent, ViewManager { super(context, attrs, defStyleAttr); children = new ArrayList(); + detachedChildren = new ArrayList(); } public void addView(View child) { @@ -136,10 +138,15 @@ public class ViewGroup extends View implements ViewParent, ViewManager { } public void detachViewFromParent(int index) { - children.remove(index).parent = null; + View child = children.remove(index); + child.parent = null; + detachedChildren.add(child); } public void attachViewToParent(View view, int index, LayoutParams params) { + if (!detachedChildren.remove(view)) { + addViewInternal(view, index, params); + } if (!checkLayoutParams(params)) params = generateLayoutParams(params); @@ -151,6 +158,9 @@ public class ViewGroup extends View implements ViewParent, ViewManager { } protected void removeDetachedView(View child, boolean animate) { + if (!detachedChildren.remove(child)) + return; + child.parent = null; native_removeView(widget, child.widget); if (isAttachedToWindow()) child.detachFromWindowInternal(); @@ -388,6 +398,7 @@ public class ViewGroup extends View implements ViewParent, ViewManager { public void detachViewFromParent(View view) { children.remove(view); view.parent = null; + detachedChildren.add(view); } public void setTouchscreenBlocksFocus(boolean touchscreenBlocksFocus) {}