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

Kotlin云头条技术点剖析(项目复习01)——启动界面

SplashACtivity的xml页面

<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".component.splash.SplashActivity"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/splash_banner"android:layout_centerHorizontal="true"android:layout_marginTop="120dp"/><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:src="@drawable/splash_logo"android:layout_alignParentBottom="true"android:layout_marginBottom="30dp"/></RelativeLayout>

其中主要复习到了相对布局中的

android:layout_centerHorizontal="true" //页面居中属性
android:layout_alignParentBottom="true" //页面底部居中

通用ViewModel Activity 封装ViewBinding

/**

  • 通用ViewModel Activity 封装ViewBinding
  • 包括ViewBinding,主要是处理每次要setContentView
  • 以及自动创建ViewModel
  • 以及viewModel的通用观察处理
    */
openclassBaseViewModelActivity<VB:ViewBinding>:BaseLoginActivity(){lateinitvarbinding:VBoverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)//调用inflate方法,创建viewBindingbinding=ReflectUtil.newViewBinding(layoutInflater,javaClass)setContentView(binding.root)}}

这段代码定义了一个泛型基类 BaseViewModelActivity,用于封装 ViewBinding 的创建过程,通过open继承 减少子类中的重复代码

ReflectUtil 封装工具类

/** * 反射工具类 */objectReflectUtil{/** * 创建view binding */fun<VB>newViewBinding(layoutInflater:LayoutInflater,clazz:Class<*>):VB{returntry{//获取泛型参数对象valtype=try{clazz.genericSuperclassasParameterizedType}catch(e:ClassCastException){clazz
http://www.jsqmd.com/news/547500/

相关文章:

  • SimCLR实战:5步搞定自监督学习图像分类(附PyTorch代码)
  • 【LangChain4j从入门到精通实战教学】003、LangChain4j核心概念拆解:Model、Prompt、Chain、Agent、Memory
  • Deepin Boot Maker:3步制作Linux启动盘的终极免费指南
  • G-Helper深度解析:华硕笔记本性能优化的轻量级解决方案
  • velocity-subtemplate-variable-fix
  • python-flask-djangol框架的网上流浪狗救助捐赠平台
  • 《掌控习惯》书摘2
  • Arduino UNO Q 板载 Nanobot 自动化编程指南之五
  • CASS10.1与鸿业软件协同处理道路平纵横数据实战指南
  • 基于cartographer算法的自主导航系统仿真设计 移动机器人系统具备定位、建图及路径规划功能
  • Windows系统实战:OpenClaw+Qwen3.5-9B自动化办公环境搭建
  • 新手零基础入门:跟着快马ai生成的centos7安装图文教程轻松搭建第一台linux服务器
  • Slurm集群搭建避坑指南:搞定Munge认证服务与MySQL的正确姿势
  • 别再折腾Hadoop了!Windows 11上用Anaconda+PySpark 3.5.1搞定本地数据分析(附避坑清单)
  • OpenClaw浏览器自动化:GLM-4.7-Flash驱动的智能搜索与数据采集
  • 我把OpenCode连上了微信ClawBot
  • LVGL图片加载优化:如何用缓存技术让JPG动画播放流畅度提升100%
  • Android Perfetto 系列 6:为什么是 120Hz?高刷新率的优势与挑战
  • Go语言中的Mutex:并发安全的守护者
  • ViGEmBus虚拟手柄驱动技术解析:解决PC游戏控制器兼容性问题的完整方案
  • python-flask-djangol框架的汽车维修保养管理系统
  • Python编译为WASM后内存暴涨8倍?:资深编译器工程师手把手教你用wasm-opt+custom allocator精准控损
  • 智谱AI创始人唐杰:通往无限机器的AGI之路
  • RC滤波器设计原理与嵌入式系统应用
  • 5G与TSN融合网络中的确定性通信:挑战与前沿调度算法解析
  • OpenClaw安全审计:Qwen3-32B镜像操作日志分析与可视化
  • OpenClaw调试技巧:nanobot任务失败排查
  • Hive与Ceph整合:分布式存储大数据方案
  • 想了解欧拉5参数配置?这篇文章给你讲得明明白白!
  • 深入解析GEM5 McPAT NoC功耗模型:从arbiter电容计算到微架构关联