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

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

Groovy 复制代码
android {
    .......

    viewBinding {
        enabled = true
    }

}

1. 新建一个Ext.kt文件

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

Kotlin 复制代码
inline fun <T : ViewBinding> AppCompatActivity.viewBinding(crossinline bindingInflater: (LayoutInflater) -> T) =
        lazy(LazyThreadSafetyMode.NONE) {
            bindingInflater.invoke(layoutInflater)
        }


inline fun <T : ViewBinding> Fragment.viewBinding(crossinline bindingInflater: (LayoutInflater, ViewGroup? , Boolean) -> T) =
        lazy(LazyThreadSafetyMode.NONE) {
            bindingInflater.invoke(layoutInflater, view?.parent as? ViewGroup, false)
        }

2. Activity中使用

BaseActivity

Kotlin 复制代码
public abstract class BaseActivity<VB : ViewBinding>(inflater: (LayoutInflater) -> VB) :
    AppCompatActivity() {

    protected val binding by viewBinding(inflater)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        initView()
        initData()
    }

    protected fun initView() {}

    protected fun initData() {}

}

继承自BaseActivity的子类

Kotlin 复制代码
class VideoPlayerActivity : BaseActivity<ActivityVideoPlayerBinding>(ActivityVideoPlayerBinding::inflate),
    View.OnClickListener {

    override fun initView() {
        binding.play.setOnClickListener(this)
    }

    override fun onClick(p0: View?) {

    }

}

3. Fragment中使用

Kotlin 复制代码
abstract class BaseFragment<VB : ViewBinding>(inflater: (LayoutInflater, ViewGroup?, Boolean) -> VB)
    : Fragment() {

    protected val binding by viewBinding(inflater)

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

    abstract fun initView(root: View, savedInstanceState: Bundle?)

}

继承自BaseFragment的子类

Kotlin 复制代码
class TestFragment : BaseFragment<FragmentTestBinding>(FragmentTestBinding::inflate) {

    override fun initView(root: View, savedInstanceState: Bundle?) {
    }

}
相关推荐
_祝你今天愉快13 小时前
从驱动来分析服务的添加过程
android
Dovis(誓平步青云)16 小时前
折叠屏悬停看视频,上半屏和下半屏应该各做什么
android·java·服务器·开发语言·安全·音视频
alexhilton17 小时前
让架构边界变成可执行的测试
android·kotlin·android jetpack
hai_android18 小时前
SendChannel 与 ReceiveChannel 通信机制
android
数据治理自习室20 小时前
AI 应用评测体系(GraphRAG)
android·大数据·人工智能·kotlin
爱笑鱼21 小时前
Android 系统启动机制(五):system_server 是 init 启动的,还是 Zygote fork 出来的?
android
智购科技无人售货机工厂21 小时前
2026自动售货机防拆机物理安全设计:从安全螺丝到结构互锁的工程实践~YH
android·网络·驱动开发·python·单片机·安全·云原生
开开心心就好21 小时前
电子教鞭工具支持画框写字插图片功能齐全
android·开发语言·前端·javascript·人工智能·pdf·html
Dovis(誓平步青云)1 天前
拍视频前先把镜头想清楚:做一个分镜取景辅助器
android·java·服务器·javascript·人工智能
峥嵘life1 天前
Android16 系统 APEX 模块说明
android·大数据·开发语言