From 180c74e2df9a9c653da8182f3fa3d0556335c5fe Mon Sep 17 00:00:00 2001 From: petterp Date: Tue, 26 Nov 2024 00:27:03 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=E8=B0=83=E6=95=B4removeView=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floatingx/imp/app/FxAppPlatformProvider.kt | 9 +++++---- .../floatingx/imp/scope/FxScopePlatFromProvider.kt | 3 ++- .../src/main/java/com/petterp/floatingx/util/FxExt.kt | 11 ++++++++++- .../petterp/floatingx/view/FxBasicContainerView.kt | 5 +++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/floatingx/src/main/java/com/petterp/floatingx/imp/app/FxAppPlatformProvider.kt b/floatingx/src/main/java/com/petterp/floatingx/imp/app/FxAppPlatformProvider.kt index e3c98a6..8ee494b 100644 --- a/floatingx/src/main/java/com/petterp/floatingx/imp/app/FxAppPlatformProvider.kt +++ b/floatingx/src/main/java/com/petterp/floatingx/imp/app/FxAppPlatformProvider.kt @@ -10,6 +10,7 @@ import com.petterp.floatingx.assist.helper.FxAppHelper import com.petterp.floatingx.listener.provider.IFxPlatformProvider import com.petterp.floatingx.util.decorView import com.petterp.floatingx.util.safeAddView +import com.petterp.floatingx.util.safeRemoveView import com.petterp.floatingx.util.topActivity import com.petterp.floatingx.view.FxDefaultContainerView import java.lang.ref.WeakReference @@ -93,7 +94,7 @@ class FxAppPlatformProvider( val fxView = _internalView ?: return false val decorView = activity.decorView ?: return false if (containerGroupView === decorView) return false - if (ViewCompat.isAttachedToWindow(fxView)) containerGroupView?.removeView(fxView) + if (ViewCompat.isAttachedToWindow(fxView)) containerGroupView?.safeRemoveView(fxView) _containerGroup = WeakReference(decorView) decorView.safeAddView(fxView) return true @@ -106,7 +107,7 @@ class FxAppPlatformProvider( return true } else { if (nContainer === containerGroupView) return false - containerGroupView?.removeView(_internalView) + containerGroupView?.safeRemoveView(_internalView) nContainer.safeAddView(_internalView) _containerGroup = WeakReference(nContainer) } @@ -119,7 +120,7 @@ class FxAppPlatformProvider( if (!ViewCompat.isAttachedToWindow(fxView)) return false val nContainer = activity.decorView ?: return false if (nContainer !== oldContainer) return false - oldContainer.removeView(_internalView) + oldContainer.safeRemoveView(_internalView) return true } @@ -135,7 +136,7 @@ class FxAppPlatformProvider( private fun detach() { _internalView?.visibility = View.GONE - containerGroupView?.removeView(_internalView) + containerGroupView?.safeRemoveView(_internalView) _containerGroup?.clear() _containerGroup = null } diff --git a/floatingx/src/main/java/com/petterp/floatingx/imp/scope/FxScopePlatFromProvider.kt b/floatingx/src/main/java/com/petterp/floatingx/imp/scope/FxScopePlatFromProvider.kt index 3977c12..48192f9 100644 --- a/floatingx/src/main/java/com/petterp/floatingx/imp/scope/FxScopePlatFromProvider.kt +++ b/floatingx/src/main/java/com/petterp/floatingx/imp/scope/FxScopePlatFromProvider.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.ViewGroup import com.petterp.floatingx.assist.helper.FxScopeHelper import com.petterp.floatingx.listener.provider.IFxPlatformProvider +import com.petterp.floatingx.util.safeRemoveView import com.petterp.floatingx.view.FxDefaultContainerView import com.petterp.floatingx.view.IFxInternalHelper import java.lang.ref.WeakReference @@ -52,7 +53,7 @@ class FxScopePlatFromProvider( } override fun reset() { - containerGroupView?.removeView(_internalView) + containerGroupView?.safeRemoveView(_internalView) _containerGroup?.clear() _containerGroup = null } diff --git a/floatingx/src/main/java/com/petterp/floatingx/util/FxExt.kt b/floatingx/src/main/java/com/petterp/floatingx/util/FxExt.kt index f2ea003..5031d0a 100644 --- a/floatingx/src/main/java/com/petterp/floatingx/util/FxExt.kt +++ b/floatingx/src/main/java/com/petterp/floatingx/util/FxExt.kt @@ -65,7 +65,7 @@ internal val Activity.contentView: FrameLayout? internal fun ViewGroup.safeAddView(view: View?, lp: ViewGroup.LayoutParams? = null) { if (view == null) return if (view.parent == this) return - (view.parent as? ViewGroup)?.removeView(view) + (view.parent as? ViewGroup)?.safeRemoveView(view) if (lp == null) { addView(view) } else { @@ -73,6 +73,15 @@ internal fun ViewGroup.safeAddView(view: View?, lp: ViewGroup.LayoutParams? = nu } } + +internal fun ViewGroup.safeRemoveView(view: View?) { + if (view == null) return + if (!view.isAttachedToWindow) return + kotlin.runCatching { + removeView(view) + } +} + /** * 创建一个fx,自行初始化并控制插入位置 * diff --git a/floatingx/src/main/java/com/petterp/floatingx/view/FxBasicContainerView.kt b/floatingx/src/main/java/com/petterp/floatingx/view/FxBasicContainerView.kt index 149dc30..74aabf1 100644 --- a/floatingx/src/main/java/com/petterp/floatingx/view/FxBasicContainerView.kt +++ b/floatingx/src/main/java/com/petterp/floatingx/view/FxBasicContainerView.kt @@ -11,6 +11,7 @@ import android.widget.FrameLayout import com.petterp.floatingx.assist.helper.FxBasisHelper import com.petterp.floatingx.util.INVALID_LAYOUT_ID import com.petterp.floatingx.util.safeAddView +import com.petterp.floatingx.util.safeRemoveView import com.petterp.floatingx.view.helper.FxViewAnimationHelper import com.petterp.floatingx.view.helper.FxViewLocationHelper import com.petterp.floatingx.view.helper.FxViewTouchHelper @@ -89,14 +90,14 @@ abstract class FxBasicContainerView @JvmOverloads constructor( override fun updateView(layoutId: Int) { helper.fxLog.d("fxView -> updateView") locationHelper.needUpdateLocation() - removeView(_childView) + safeRemoveView(_childView) installChildView() } override fun updateView(layoutView: View) { helper.fxLog.d("fxView -> updateView") locationHelper.needUpdateLocation() - removeView(_childView) + safeRemoveView(_childView) installChildView() }