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

Android-Kotlin基础(Jetpack③-LiveData)

和传统方式的核心区别:
传统方式需要手动调用 textView.setText() 更新 UI
传统方式需要自己处理屏幕旋转的数据保存
传统方式可能在 Activity 销毁后更新 UI 导致崩溃

CounterViewModel.kt

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel// ViewModel 负责管理数据和业务逻辑
class CounterViewModel : ViewModel() {// 私有可变的 LiveData(内部修改)private val _count = MutableLiveData(0)// 公开不可变的 LiveData(供 UI 观察)val count: LiveData<Int> = _count// 增加计数的方法fun increment() {// 获取当前值,加1后更新(主线程用setValue)_count.value = _count.value?.plus(1)}// 重置计数的方法fun reset() {_count.value = 0}
}

MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import com.example.livedatademo.databinding.ActivityMainBindingclass MainActivity : AppCompatActivity() {private lateinit var binding: ActivityMainBindingprivate lateinit var viewModel: CounterViewModeloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 初始化 DataBindingbinding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)// 获取 ViewModel 实例viewModel = ViewModelProvider(this)[CounterViewModel::class.java]// 观察 LiveData 变化,自动更新 UIviewModel.count.observe(this) { newCount ->// 数据变化时自动执行,已在主线程binding.tvCount.text = "当前计数: $newCount"}// 绑定按钮点击事件binding.btnIncrement.setOnClickListener {viewModel.increment() // 只修改数据,UI 自动更新}binding.btnReset.setOnClickListener {viewModel.reset() // 只修改数据,UI 自动更新}}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"android:padding="16dp"><TextViewandroid:id="@+id/tvCount"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="24sp"android:marginBottom="32dp"/><Buttonandroid:id="@+id/btnIncrement"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="加1"android:layout_marginBottom="16dp"/><Buttonandroid:id="@+id/btnReset"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="重置"/></LinearLayout>
</layout>

http://www.dtcms.com/a/319041.html

相关文章:

  • 数据结构初阶(4)栈
  • Python生成统计学公式
  • 数据结构:双向链表(Doubly Linked List)
  • 快速搭建开源网页编辑器(vue+TinyMCE)
  • 大屏数据展示页面,数据可视化可以用到的框架和插件
  • 剧本杀小程序系统开发:推动社交娱乐产业创新发展
  • requests模块
  • Web3.0引领互联网未来,助力安全防护升级
  • 基于django的非物质文化遗产可视化网站设计与实现
  • 重学React(三):状态管理
  • Java如何快速实现短信登录?
  • 【指南版】网络与信息安全岗位系列(三):安全运维工程师
  • 农作物优选,耕耘希望的田野
  • Vue3获取当前页面相对路径
  • 008 前端vue
  • Android-Kotlin基础(Jetpack①-ViewModel)
  • 【遥感图像入门】近三年遥感图像建筑物细粒度分类技术一览
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第七天(Vue)(二)
  • Tiger任务管理系统-10
  • vue打包号的文件如何快速查找文件打包后的位置
  • 聚水潭API数据接口开发手机端网页查询商品仓位库位库存工具,支持扫描识别,预览图片
  • Numpy科学计算与数据分析:Numpy线性代数基础与实践
  • 决策树技术详解:从理论到Python实战
  • RabbitMQ-日常运维命令
  • 华为开源CANN,再次释放“昇腾转向”信号
  • 【数据结构初阶】--排序(五)--计数排序,排序算法复杂度对比和稳定性分析
  • C语言memmove函数详解:安全高效的内存复制利器
  • ELK基础环境安装准备
  • 飞算JavaAI深度解析:Java开发者的智能革命
  • 构建一个简洁优雅的 PHP 参数验证器 —— php-schema-validator