From e0835808e3cf515f4cfb7ee52fa4459fc678cb4f Mon Sep 17 00:00:00 2001 From: Quyunshuo Date: Sun, 20 Aug 2023 20:36:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E6=B7=B7=E6=B7=86=E5=90=8E=E5=8F=8D=E5=B0=84=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=AF=BC=E8=87=B4=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E5=B0=86=E5=8F=8D=E5=B0=84?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=9D=E5=A7=8B=E5=8C=96=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E4=B8=BA=E5=AD=90=E7=B1=BB=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9A=84=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/proguard-rules.pro | 6 - .../base/mvvm/v/BaseFrameActivity.kt | 9 +- .../base/mvvm/v/BaseFrameFragment.kt | 3 +- .../base/mvvm/v/BaseFrameStatusActivity.kt | 40 ----- .../base/mvvm/v/BaseFrameStatusFragment.kt | 41 ----- .../base/mvvm/v/FrameView.kt | 10 +- .../base/utils/BindingReflex.kt | 156 ------------------ lib_base/src/main/res/values/strings.xml | 4 + .../module/home/activity/MainActivity.kt | 2 + 9 files changed, 19 insertions(+), 252 deletions(-) delete mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusActivity.kt delete mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusFragment.kt delete mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/BindingReflex.kt create mode 100644 lib_base/src/main/res/values/strings.xml diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 182dc6d..a084a86 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,9 +1,3 @@ -# 避免 ViewBinding 类被混淆导致反射初始化失败 --keep public interface androidx.viewbinding.ViewBinding --keepclassmembers class * implements androidx.viewbinding.ViewBinding{ - *; -} - # AGP 8.x 警告生成 # Please add these rules to your existing keep rules in order to suppress warnings. # This is generated automatically by the Android Gradle plugin. diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt index 35b1500..5cfc5a9 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt @@ -6,6 +6,7 @@ import android.os.Looper import androidx.appcompat.app.AppCompatActivity import androidx.viewbinding.ViewBinding import com.alibaba.android.arouter.launcher.ARouter +import com.quyunshuo.androidbaseframemvvm.base.R import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel import com.quyunshuo.androidbaseframemvvm.base.utils.* import com.quyunshuo.androidbaseframemvvm.base.utils.network.AutoRegisterNetListener @@ -22,12 +23,10 @@ import me.jessyan.autosize.AutoSizeCompat abstract class BaseFrameActivity : AppCompatActivity(), FrameView, NetworkStateChangeListener { - protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) { - BindingReflex.reflexViewBinding(javaClass, layoutInflater) - } - protected abstract val mViewModel: VM + protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) { createVB() } + /** * 是否有 [RegisterEventBus] 注解,避免重复调用 [Class.isAnnotation] */ @@ -80,7 +79,7 @@ abstract class BaseFrameActivity : AppComp * @return Unit */ override fun networkConnectChange(isConnected: Boolean) { - toast(if (isConnected) "网络已连接" else "网络已断开") + toast(if (isConnected) getString(R.string.base_network_connected) else getString(R.string.base_network_disconnected)) } override fun onDestroy() { diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt index c646c68..cb7707d 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt @@ -8,7 +8,6 @@ import androidx.fragment.app.Fragment import androidx.viewbinding.ViewBinding import com.alibaba.android.arouter.launcher.ARouter import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel -import com.quyunshuo.androidbaseframemvvm.base.utils.BindingReflex import com.quyunshuo.androidbaseframemvvm.base.utils.RegisterEventBus import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusUtils @@ -40,7 +39,7 @@ abstract class BaseFrameFragment : Fragmen container: ViewGroup?, savedInstanceState: Bundle? ): View? { - _binding = BindingReflex.reflexViewBinding(javaClass, layoutInflater) + _binding = createVB() return _binding?.root } diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusActivity.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusActivity.kt deleted file mode 100644 index 8a5da26..0000000 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusActivity.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.quyunshuo.androidbaseframemvvm.base.mvvm.v - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper - -/** - * @author DBoy 2021/8/5

- * - 文件描述 : 基础状态管理Activity - */ -open class BaseFrameStatusActivity : AppCompatActivity() { - /** - * 基础状态管理帮助类 - */ - private var mBaseStatusHelper: ViewStatusHelper? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - //注册状态帮助类 - mBaseStatusHelper = onRegisterStatusHelper() - //恢复状态数据 - mBaseStatusHelper?.onRestoreInstanceStatus(savedInstanceState) - } - - /** - * 保存状态 - */ - override fun onSaveInstanceState(outState: Bundle) { - mBaseStatusHelper?.onSaveInstanceState(outState) - super.onSaveInstanceState(outState) - } - - /** - * 注册状态管理帮助类,子类重写此方法以注册帮助类。 - * 每一层都有可能有自己的状态管理帮助类,所以继承重写的时候,需要将super的对象传入自己的帮助类构造函数中 - */ - protected open fun onRegisterStatusHelper(): ViewStatusHelper? { - return null - } -} \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusFragment.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusFragment.kt deleted file mode 100644 index b00a6b0..0000000 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusFragment.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.quyunshuo.androidbaseframemvvm.base.mvvm.v - -import android.os.Bundle -import android.view.View -import androidx.fragment.app.Fragment -import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper - -/** - * @author DBoy 2021/8/5

- * - 文件描述 : 基础状态管理Fragment - */ -open class BaseFrameStatusFragment : Fragment() { - /** - * 基础状态管理帮助类 - */ - private var mBaseStatusHelper: ViewStatusHelper? = null - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - //注册状态帮助类 - mBaseStatusHelper = onRegisterStatusHelper() - //恢复状态数据 - mBaseStatusHelper?.onRestoreInstanceStatus(savedInstanceState) - } - - /** - * 保存状态 - */ - override fun onSaveInstanceState(outState: Bundle) { - mBaseStatusHelper?.onSaveInstanceState(outState) - super.onSaveInstanceState(outState) - } - - /** - * 注册状态管理帮助类,子类重写此方法以注册帮助类。 - * 每一层都有可能有自己的状态管理帮助类,所以继承重写的时候,需要将super的对象传入自己的帮助类构造函数中 - */ - protected open fun onRegisterStatusHelper(): ViewStatusHelper? { - return null - } -} \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/FrameView.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/FrameView.kt index 26aab76..02945fe 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/FrameView.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/FrameView.kt @@ -1,5 +1,6 @@ package com.quyunshuo.androidbaseframemvvm.base.mvvm.v +import androidx.lifecycle.LiveData import androidx.viewbinding.ViewBinding /** @@ -11,12 +12,17 @@ import androidx.viewbinding.ViewBinding interface FrameView { /** - * 初始化View + * 创建 [ViewBinding] 实例 + */ + fun createVB(): VB + + /** + * 初始化 View */ fun VB.initView() /** - * 订阅LiveData + * 订阅 [LiveData] */ fun initObserve() diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/BindingReflex.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/BindingReflex.kt deleted file mode 100644 index e45f216..0000000 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/BindingReflex.kt +++ /dev/null @@ -1,156 +0,0 @@ -package com.quyunshuo.androidbaseframemvvm.base.utils - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.ViewModelStoreOwner -import androidx.viewbinding.ViewBinding -import java.lang.reflect.InvocationTargetException -import java.lang.reflect.ParameterizedType -import java.util.* - -/** - * @author DBoy - * @date 2020/9/29 - * Class 描述 : 用于反射获取 ViewModel 和 ViewBinding - */ -object BindingReflex { - /** - * 反射获取ViewBinding - * - * @param ViewBinding 实现类 - * @param aClass 当前类 - * @param from layouinflater - * @return viewBinding实例 - */ - fun reflexViewBinding(aClass: Class<*>, from: LayoutInflater?): V { - try { - val actualTypeArguments = - (Objects.requireNonNull(aClass.genericSuperclass) as ParameterizedType).actualTypeArguments - for (i in actualTypeArguments.indices) { - val tClass: Class - try { - tClass = actualTypeArguments[i] as Class - } catch (e: Exception) { - continue - } - if (ViewBinding::class.java.isAssignableFrom(tClass)) { - val inflate = tClass.getMethod("inflate", LayoutInflater::class.java) - return inflate.invoke(null, from) as V - } - } - return reflexViewBinding(aClass.superclass, from) - } catch (e: NoSuchMethodException) { - e.printStackTrace() - } catch (e: IllegalAccessException) { - e.printStackTrace() - } catch (e: InvocationTargetException) { - e.printStackTrace() - } - throw RuntimeException("ViewBinding初始化失败") - } - - /** - * 反射获取ViewBinding\ - */ - fun reflexViewBinding( - aClass: Class<*>, - from: LayoutInflater?, - viewGroup: ViewGroup?, - b: Boolean - ): V { - try { - val actualTypeArguments = - (Objects.requireNonNull(aClass.genericSuperclass) as ParameterizedType).actualTypeArguments - for (i in actualTypeArguments.indices) { - val tClass: Class - try { - tClass = actualTypeArguments[i] as Class - } catch (e: Exception) { - continue - } - if (ViewBinding::class.java.isAssignableFrom(tClass)) { - val inflate = tClass.getDeclaredMethod( - "inflate", - LayoutInflater::class.java, - ViewGroup::class.java, - Boolean::class.javaPrimitiveType - ) - return inflate.invoke(null, from, viewGroup, b) as V - } - } - return reflexViewBinding(aClass.superclass, from, viewGroup, b) as V - } catch (e: NoSuchMethodException) { - e.printStackTrace() - } catch (e: IllegalAccessException) { - e.printStackTrace() - } catch (e: InvocationTargetException) { - e.printStackTrace() - } - throw RuntimeException("ViewBinding初始化失败") - } - - /** - * 反射获取ViewModel - * - * @param ViewModel实现类 - * @param aClass 当前class - * @param owner 生命周期管理 - * @return ViewModel实例 - */ - fun reflexViewModel(aClass: Class<*>, owner: ViewModelStoreOwner): VM { - try { - val actualTypeArguments = - (Objects.requireNonNull(aClass.genericSuperclass) as ParameterizedType).actualTypeArguments - for (i in actualTypeArguments.indices) { - val tClass: Class - try { - tClass = actualTypeArguments[i] as Class - } catch (e: Exception) { - continue - } - if (ViewModel::class.java.isAssignableFrom(tClass)) { - return ViewModelProvider(owner)[tClass as Class] - } - } - return reflexViewModel(aClass.superclass, owner) - } catch (e: Exception) { - e.printStackTrace() - } - throw RuntimeException("ViewModel初始化失败") - } - - /** - * 反射获取ViewModel,这个方法只提供给fragment使用. - * 如果fragment的父Activity有相同的ViewModel 那么生成的ViewModel将会是同一个实例,做到Fragment与Activity的数据同步, - * 或者说是同一个Activity中的多个Fragment同步使用用一个ViewModel达到数据之间的同步。 - * - * @param ViewModel实现类 - * @param aClass 当前class - * @param fragment fragment 调用 [Fragment.requireActivity] 方法 - * @return ViewModel实例 - */ - fun reflexViewModelShared(aClass: Class<*>, fragment: Fragment): VM { - try { - val actualTypeArguments = - (Objects.requireNonNull(aClass.genericSuperclass) as ParameterizedType).actualTypeArguments - for (i in actualTypeArguments.indices) { - val tClass: Class - try { - tClass = actualTypeArguments[i] as Class - } catch (e: Exception) { - continue - } - if (ViewModel::class.java.isAssignableFrom(tClass)) { - return ViewModelProvider(fragment.requireActivity())[tClass as Class] - } - } - return reflexViewModelShared(aClass.superclass, fragment) - } catch (e: Exception) { - e.printStackTrace() - } - throw RuntimeException("ViewModel初始化失败") - } -} \ No newline at end of file diff --git a/lib_base/src/main/res/values/strings.xml b/lib_base/src/main/res/values/strings.xml new file mode 100644 index 0000000..26085fb --- /dev/null +++ b/lib_base/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + 网路已断开 + 网络已连接 + \ No newline at end of file diff --git a/module_home/src/main/java/com/quyunshuo/module/home/activity/MainActivity.kt b/module_home/src/main/java/com/quyunshuo/module/home/activity/MainActivity.kt index eaca665..2b4bef5 100644 --- a/module_home/src/main/java/com/quyunshuo/module/home/activity/MainActivity.kt +++ b/module_home/src/main/java/com/quyunshuo/module/home/activity/MainActivity.kt @@ -21,6 +21,8 @@ class MainActivity : BaseActivity() { */ override val mViewModel by viewModels() + override fun createVB() = HomeActivityMainBinding.inflate(layoutInflater) + override fun HomeActivityMainBinding.initView() {} override fun initObserve() {