当前位置: 首页 > news >正文

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

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


android {.......viewBinding {enabled = true}}

1. 新建一个Ext.kt文件 

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

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

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的子类 

class VideoPlayerActivity : BaseActivity<ActivityVideoPlayerBinding>(ActivityVideoPlayerBinding::inflate),View.OnClickListener {override fun initView() {binding.play.setOnClickListener(this)}override fun onClick(p0: View?) {}}

3. Fragment中使用

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的子类

class TestFragment : BaseFragment<FragmentTestBinding>(FragmentTestBinding::inflate) {override fun initView(root: View, savedInstanceState: Bundle?) {}}

相关文章:

  • 外贸须知音频设备亚马逊出口欧盟CE认证测试标准解析
  • ArcGIS计算土地现状容积率
  • Redis 的另一个集群版之 Codis 集群
  • flask踩坑集锦
  • 【Mybatis-Plus】常见的@table类注解
  • 算法题学习
  • Spring Security 6.1.x 系列(2)—— 基于过滤器的基础原理(一)
  • 免费(daoban)gpt,同时去除广告
  • SSH 端口转发:动态转发、本地转发、远程转发
  • git log 用法
  • Python数据分析实战-筛选出DataFrame中指定列都不包含缺失值的记录(附源码和实现效果)
  • 【Spring】SpringWebMVC入门
  • 自定义QChartView实现鼠标放在图表时,显示鼠标位置坐标值(x,y)
  • 能卷死同行的收银系统源码--服装店收银系统+进销存、PHP+mysql
  • 大文件分片上传并发
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • conda常用的命令
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • git 常用命令
  • Invalidate和postInvalidate的区别
  • js操作时间(持续更新)
  • Koa2 之文件上传下载
  • leetcode-27. Remove Element
  • Meteor的表单提交:Form
  • OSS Web直传 (文件图片)
  • Promise面试题2实现异步串行执行
  • vue 个人积累(使用工具,组件)
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue数据传递--我有特殊的实现技巧
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 笨办法学C 练习34:动态数组
  • 微信小程序设置上一页数据
  • 7行Python代码的人脸识别
  • gunicorn工作原理
  • 带你开发类似Pokemon Go的AR游戏
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • $refs 、$nextTic、动态组件、name的使用
  • (12)Hive调优——count distinct去重优化
  • (2)STL算法之元素计数
  • (c语言)strcpy函数用法
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (poj1.3.2)1791(构造法模拟)
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (五)网络优化与超参数选择--九五小庞
  • (原創) 未来三学期想要修的课 (日記)
  • .NET Core中Emit的使用
  • .NET MVC第三章、三种传值方式
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET单元测试
  • .net快速开发框架源码分享