You must call removeView() on the child's parent first 的處理。
阿新 • • 發佈:2019-01-12
這個問題是由於我們想加入的view已經存在parent導致,一般我們只需要呼叫((ViewGroup)view.getParent()).removeView(view)即可,可是有些時候並不能解決問題。這時候可以參考以下程式碼。
if (child.getParent() instanceof ViewGroup) { ViewGroup parent = (ViewGroup) child.getParent(); LayoutTransition layoutTransition = null; if (parent.getLayoutTransition() != null) { layoutTransition = parent.getLayoutTransition(); parent.setLayoutTransition(null); } parent.removeView(child); if (layoutTransition != null) { parent.setLayoutTransition(layoutTransition); } if (child.getParent() != null) { // LayoutTransition 將會造成removeView延遲,取消它 ViewGroupUtils.cancelLayoutTransition(parent); // 假如view還是由於某些原因存在view if (child.getParent() != null && FIELD_VIEW_PARENT != null) { //通過反射直接把parent設為空 ReflectionUtils.setFieldValue(child, ReflectionUtils.getPrivateField(View.class, "mParent"), null); } } //還存在parent,暫時放棄= = if (child.getParent() != null) { return; } }
public boolean cancelLayoutTransition(ViewGroup group) { if (group != null) { final LayoutTransition layoutTransition = group.getLayoutTransition(); if (layoutTransition != null && layoutTransition.isRunning() && METHOD_LAYOUT_TRANSITION_CANCEL != null) { //由於cancel方法是@hide,所以需要反射呼叫 ReflectionUtils.invoke(group.getLayoutTransition(), null, ReflectionUtils.getPrivateMethod(LayoutTransition.class, "cancel")); return true; } } return false; }