• (笔记)Kotlin——Android封装ViewBinding之二 优化


     0. 在app模块的build.gradle文件中添加如下配置开启ViewBinding 

    1. android {
    2. .......
    3. viewBinding {
    4. enabled = true
    5. }
    6. }

    1. 新建一个Ext.kt文件 

    添加两个扩展函数,分别对应Activity和Fragment

    1. inline fun AppCompatActivity.viewBinding(crossinline bindingInflater: (LayoutInflater) -> T) =
    2. lazy(LazyThreadSafetyMode.NONE) {
    3. bindingInflater.invoke(layoutInflater)
    4. }
    5. inline fun Fragment.viewBinding(crossinline bindingInflater: (LayoutInflater, ViewGroup? , Boolean) -> T) =
    6. lazy(LazyThreadSafetyMode.NONE) {
    7. bindingInflater.invoke(layoutInflater, view?.parent as? ViewGroup, false)
    8. }

    2. Activity中使用

    BaseActivity

    1. public abstract class BaseActivity<VB : ViewBinding>(inflater: (LayoutInflater) -> VB) :
    2. AppCompatActivity() {
    3. protected val binding by viewBinding(inflater)
    4. override fun onCreate(savedInstanceState: Bundle?) {
    5. super.onCreate(savedInstanceState)
    6. setContentView(binding.root)
    7. initView()
    8. initData()
    9. }
    10. protected fun initView() {}
    11. protected fun initData() {}
    12. }

    继承自BaseActivity的子类 

    1. class VideoPlayerActivity : BaseActivity<ActivityVideoPlayerBinding>(ActivityVideoPlayerBinding::inflate),
    2. View.OnClickListener {
    3. override fun initView() {
    4. binding.play.setOnClickListener(this)
    5. }
    6. override fun onClick(p0: View?) {
    7. }
    8. }

    3. Fragment中使用

    1. abstract class BaseFragment<VB : ViewBinding>(inflater: (LayoutInflater, ViewGroup?, Boolean) -> VB)
    2. : Fragment() {
    3. protected val binding by viewBinding(inflater)
    4. override fun onCreateView(
    5. inflater: LayoutInflater,
    6. container: ViewGroup?,
    7. savedInstanceState: Bundle?
    8. ): View? {
    9. initView(binding.root, savedInstanceState)
    10. return binding.root
    11. }
    12. abstract fun initView(root: View, savedInstanceState: Bundle?)
    13. }

    继承自BaseFragment的子类

    1. class TestFragment : BaseFragment<FragmentTestBinding>(FragmentTestBinding::inflate) {
    2. override fun initView(root: View, savedInstanceState: Bundle?) {
    3. }
    4. }
  • 相关阅读:
    ESP8266远程控制电子门
    vector与list的区别与应用?
    波奇学C++:哈希
    Python通过pyecharts对爬虫房地产数据进行数据可视化分析(一)
    多线程消息处理
    sourcetree 配置 gitlab ssh及公钥私钥设置
    Kotlin--内置函数的总结
    SpringCloud gateway自定义请求的 httpClient
    Zookeeper系列——概述
    设计模式之模板方法模式详解(下)
  • 原文地址:https://blog.csdn.net/u011046452/article/details/134162245