MVVM BaseActivity和BaseFragment 封装

1,498 阅读1分钟

使用ViewModel+LiveDta+ViewBinding


/**
 * BaseActivity 基类
 */
abstract class BaseActivity<VM : ViewModel, BV : ViewBinding> : AppCompatActivity(), BaseActivityView<BV> {
    /**
     * TAG
     */
    protected val TAG: String = javaClass.simpleName

    /**
     * viewBinding
     */
    protected lateinit var binding: BV

    /**
     * ViewModel
     */
    protected lateinit var mViewModel: VM

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = getViewBinding()
        setContentView(binding.root)
        mViewModel = createViewModel()
        onCreate()
    }

    override fun onDestroy() {
        super.onDestroy()
        onDestroy()
    }

    /**
     * 创建viewModel
     */
    private fun createViewModel(): VM {
        return ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(getVmClazz(this))
    }

    /**
     * 获取当前类绑定的泛型ViewModel-clazz
     */
    private fun <VM> getVmClazz(obj: Any): VM {
        return (obj.javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as VM
    }

}
interface BaseActivityView<BV : ViewBinding> {

    /**
     * onCreate 什么周期
     */
    fun onCreate()

    /**
     * onDestroy 声明周期
     */
    fun onDestroy()

    /**
     * 获取ViewBinding 未使用反射 以便提升性能
     */
    fun getViewBinding(): BV


}
/**
 * Fragment基类
 */
abstract class BaseFragment<VM : ViewModel, VB : ViewBinding> : Fragment(), BaseFragmentView<VB> {
    /**
     * TAG
     */
    protected val TAG: String = javaClass.simpleName

    /**
     * viewBinding
     */
    protected lateinit var binding: VB

    /**
     * ViewModel
     */
    protected lateinit var mViewModel: VM

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = getViewBinding()
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mViewModel = createViewModel()
        onViewCreate()
    }

    /**
     * 创建viewModel
     */
    private fun createViewModel(): VM {
        return ViewModelProvider(this).get(getVmClazz(this))
    }


    /**
     * 获取当前类绑定的泛型ViewModel-clazz
     */
    private fun <VM> getVmClazz(obj: Any): VM {
        return (obj.javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as VM
    }
}
interface BaseFragmentView<VB:ViewBinding> {
    /**
     * 声明周期onViewCreate
     */
    fun onViewCreate()

    /**
     * 获取ViewBinding 未使用反射 以便提升性能
     */
    fun getViewBinding(): VB
}