From 0104c72e1e3bd65fbafb58c75eef245b34e5789d Mon Sep 17 00:00:00 2001 From: hi-dhl Date: Wed, 11 May 2022 17:39:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20ViewGroup=20=E9=94=80=E6=AF=81=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=E9=87=8A=E6=94=BE=E8=B5=84=E6=BA=90=20(#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../hi/dhl/binding/base/ActivityDelegate.kt | 19 +++-------------- .../com/hi/dhl/binding/ext/LifecycleExt.kt | 21 +++++++++++++++++++ .../binding/viewbind/ViewGroupViewBinding.kt | 21 +++++++++++++++++++ 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d7058e6..884a321 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { defaultConfig { applicationId "com.hi.dhl.demo.binding" - minSdkVersion 26 + minSdkVersion 24 targetSdkVersion 30 versionCode 1 versionName "1.0" diff --git a/binding/src/main/java/com/hi/dhl/binding/base/ActivityDelegate.kt b/binding/src/main/java/com/hi/dhl/binding/base/ActivityDelegate.kt index b57ff6b..83733a4 100644 --- a/binding/src/main/java/com/hi/dhl/binding/base/ActivityDelegate.kt +++ b/binding/src/main/java/com/hi/dhl/binding/base/ActivityDelegate.kt @@ -3,11 +3,9 @@ package com.hi.dhl.binding.base import android.app.Activity import android.os.Build import androidx.activity.ComponentActivity -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.FragmentActivity import androidx.viewbinding.ViewBinding -import com.hi.dhl.binding.LifecycleFragment import com.hi.dhl.binding.observerWhenDestroyed +import com.hi.dhl.binding.registerLifecycleBelowQ import kotlin.properties.ReadOnlyProperty /** @@ -37,20 +35,9 @@ abstract class ActivityDelegate( } - /** - * 当继承 Activity 且 Build.VERSION.SDK_INT < Build.VERSION_CODES.Q 以下的时候, - * 会添加一个 空白的 Fragment, 当生命周期处于 onDestroy 时销毁数据 - */ fun addLifecycleFragment(activity: Activity) { - if (activity is FragmentActivity || activity is AppCompatActivity) return - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) return - - val fragmentManager = activity.fragmentManager - if (fragmentManager.findFragmentByTag(LIFECYCLE_FRAGMENT_TAG) == null) { - val transaction = fragmentManager.beginTransaction() - transaction.add(LifecycleFragment { destroyed() }, LIFECYCLE_FRAGMENT_TAG).commit() - fragmentManager.executePendingTransactions() + activity.registerLifecycleBelowQ { + destroyed() } } diff --git a/binding/src/main/java/com/hi/dhl/binding/ext/LifecycleExt.kt b/binding/src/main/java/com/hi/dhl/binding/ext/LifecycleExt.kt index 1f6177f..fa6922d 100644 --- a/binding/src/main/java/com/hi/dhl/binding/ext/LifecycleExt.kt +++ b/binding/src/main/java/com/hi/dhl/binding/ext/LifecycleExt.kt @@ -6,6 +6,8 @@ import android.app.Application import android.app.Fragment import android.os.Build import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.FragmentActivity import androidx.lifecycle.BindingLifecycleObserver import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner @@ -98,3 +100,22 @@ class LifecycleFragment : Fragment { destroyed = null } } + +/** + * 当继承 Activity 且 Build.VERSION.SDK_INT < Build.VERSION_CODES.Q 以下的时候, + * 会添加一个 空白的 Fragment, 当生命周期处于 onDestroy 时销毁数据 + */ +private const val LIFECYCLE_FRAGMENT_TAG = "com.hi.dhl.binding.lifecycle_fragment" +internal inline fun Activity.registerLifecycleBelowQ(crossinline destroyed: () -> Unit) { + val activity = this + if (activity is FragmentActivity || activity is AppCompatActivity) return + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) return + + val fragmentManager = activity.fragmentManager + if (fragmentManager.findFragmentByTag(LIFECYCLE_FRAGMENT_TAG) == null) { + val transaction = fragmentManager.beginTransaction() + transaction.add(LifecycleFragment { destroyed() }, LIFECYCLE_FRAGMENT_TAG).commit() + fragmentManager.executePendingTransactions() + } +} diff --git a/binding/src/main/java/com/hi/dhl/binding/viewbind/ViewGroupViewBinding.kt b/binding/src/main/java/com/hi/dhl/binding/viewbind/ViewGroupViewBinding.kt index 291a1d2..9bebc0f 100644 --- a/binding/src/main/java/com/hi/dhl/binding/viewbind/ViewGroupViewBinding.kt +++ b/binding/src/main/java/com/hi/dhl/binding/viewbind/ViewGroupViewBinding.kt @@ -1,10 +1,15 @@ package com.hi.dhl.binding.viewbind +import android.app.Activity +import android.os.Build import android.view.LayoutInflater import android.view.ViewGroup +import androidx.activity.ComponentActivity import androidx.viewbinding.ViewBinding import com.hi.dhl.binding.inflateMethod import com.hi.dhl.binding.inflateMethodWithViewGroup +import com.hi.dhl.binding.observerWhenDestroyed +import com.hi.dhl.binding.registerLifecycleBelowQ import java.lang.reflect.Method import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty @@ -32,6 +37,22 @@ class ViewGroupViewBinding( } else { layoutInflater = classes.inflateMethod() } + + viewGroup?.apply { + when (context) { + is ComponentActivity -> { + (context as ComponentActivity).lifecycle.observerWhenDestroyed { destroyed() } + } + is Activity -> { + val activity = context as Activity + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + activity.observerWhenDestroyed { destroyed() } + } else { + activity.registerLifecycleBelowQ { destroyed() } + } + } + } + } } override fun getValue(thisRef: ViewGroup, property: KProperty<*>): T {