(Kotlin)BaseActivity 和 BaseFragment 的现代化架构:ViewBinding 与 ViewModel 的深度整合

BaseActivity 和 BaseFragment 实现,集成了 View Binding,并增加了对 LifecycleViewModel 的支持,同时进一步简化了代码结构,使其更易用、更灵活。

1. 启用 View Binding
在 build.gradle 中启用 View Binding:

android {
    ...
    viewBinding {
        isEnabled = true
    }
}

2. BaseActivity

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.viewbinding.ViewBinding

abstract class BaseActivity : AppCompatActivity() {

    private var _binding: VB? = null
    protected val binding get() = _binding!!

    private var _viewModel: VM? = null
    protected val viewModel get() = _viewModel!!

    @CallSuper
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        _binding = createViewBinding()
        setContentView(binding.root)

        _viewModel = ViewModelProvider(this).get(getViewModelClass())

        setupViews()
        observeData()
    }

    // 创建 ViewBinding 实例
    protected abstract fun createViewBinding(): VB

    // 获取 ViewModel 的 Class 类型
    protected abstract fun getViewModelClass(): Class

    // 初始化视图
    protected abstract fun setupViews()

    // 观察数据(可选)
    protected open fun observeData() {
        // 默认空实现,子类可按需重写
    }

    override fun onDestroy() {
        super.onDestroy()
        _binding = null // 清理 binding 引用,避免内存泄漏
    }
}

3. BaseFragment

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.viewbinding.ViewBinding

abstract class BaseFragment : Fragment() {

    private var _binding: VB? = null
    protected val binding get() = _binding!!

    private var _viewModel: VM? = null
    protected val viewModel get() = _viewModel!!

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

    @CallSuper
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        _viewModel = ViewModelProvider(this).get(getViewModelClass())

        setupViews()
        observeData()
    }

    // 创建 ViewBinding 实例
    protected abstract fun createViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB

    // 获取 ViewModel 的 Class 类型
    protected abstract fun getViewModelClass(): Class

    // 初始化视图
    protected abstract fun setupViews()

    // 观察数据(可选)
    protected open fun observeData() {
        // 默认空实现,子类可按需重写
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null // 清理 binding 引用,避免内存泄漏
    }
}

4. 使用示例
MainActivity

class MainActivity : BaseActivity() {

    override fun createViewBinding(): ActivityMainBinding {
        return ActivityMainBinding.inflate(layoutInflater)
    }

    override fun getViewModelClass(): Class {
        return MainViewModel::class.java
    }

    override fun setupViews() {
        // 使用 binding 访问视图
        binding.textView.text = "Hello, Optimized View Binding!"

        // 使用 ViewModel 数据
        viewModel.liveData.observe(this) { data ->
            // 更新 UI
        }
    }

    override fun observeData() {
        // 观察数据变化(可选)
    }
}

HomeFragment

class HomeFragment : BaseFragment() {

    override fun createViewBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentHomeBinding {
        return FragmentHomeBinding.inflate(inflater, container, false)
    }

    override fun getViewModelClass(): Class {
        return HomeViewModel::class.java
    }

    override fun setupViews() {
        // 使用 binding 访问视图
        binding.button.setOnClickListener {
            // 处理点击事件
        }

        // 使用 ViewModel 数据
        viewModel.liveData.observe(viewLifecycleOwner) { data ->
            // 更新 UI
        }
    }

    override fun observeData() {
        // 观察数据变化(可选)
    }
}

5. 优化点说明
支持 ViewModel:通过泛型参数 ,基类可以动态绑定具体的 ViewModel 类。

observeData 方法:用于观察 ViewModel 中的数据变化(如 LiveData),子类可按需重写。

内存泄漏防护:在 onDestroy(Activity)和 onDestroyViewFragment)中清理 binding 引用,避免内存泄漏。

简化代码结构:Kotlin 的语法更加简洁,减少了冗余代码。

@CallSuper 注解:确保子类在重写方法时调用 super,避免遗漏基类的关键逻辑。

6. 注意事项
确保布局文件的名称符合 View Binding 的命名规则(如 activity_main.xml 对应 ActivityMainBinding)。

如果某个布局不需要 Binding,可以在布局文件的根标签中添加 tools:viewBindingIgnore=“true”

通过这种方式,你可以在 Kotlin 项目中轻松集成 View Binding 和 ViewModel,并享受 Kotlin 带来的简洁性和安全性!如果有其他问题,欢迎随时提问!

你可能感兴趣的:(Kotlin语法,kotlin,架构,开发语言)