使用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
}