(笔记)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?) {
    }

}
相关推荐
7 小时前
深度解析Compose中的BoxWithConstraints
android·kotlin·android jetpack
jolimark7 小时前
MySQL--》如何在MySQL中打造高效优化索引
android·mysql·adb
book123_0_998 小时前
【MySQL】MySQL函数之JSON_EXTRACT
android·mysql·json
冬奇Lab8 小时前
ContentProvider与Uri权限:跨应用数据共享
android·源码阅读
峥嵘life8 小时前
Android16 【GTS】 GtsDevicePolicyTestCases 测试存在Failed项
android·linux·学习
aqi009 小时前
【送书活动】《鸿蒙HarmonyOS 6:应用开发从零基础到App上线》迎新送书啦
android·华为·harmonyos·鸿蒙
良逍Ai出海10 小时前
OpenClaw 新手最该先搞懂的 2 套命令
android·java·数据库
hindon11 小时前
一文读懂 ViewModel
android
程序员JerrySUN11 小时前
别再把 HTTPS 和 OTA 看成两回事:一篇讲透 HTTPS 协议、安全通信机制与 Mender 升级加密链路的完整文章
android·java·开发语言·深度学习·流程图
音视频牛哥11 小时前
Android平台GB28181设备接入模块架构解析、功能详解与典型应用场景分析
android·android gb28181·gb28181安卓端·gb28181对接·gb28181设备·gb28181语音广播·安卓gb28181设备对接