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

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.xdnf.cn/news/17309.html

相关文章:

  • 连续最高天数的销售额(动态规划)
  • Pytest项目_day07(pytest)
  • 《C语言》函数练习题--2
  • Android 之 Jetpack WorkManager
  • 突破距离桎梏:5G 高清视频终端如何延伸无人机图传边界
  • 无人机光伏巡检效率提升68%!陌讯动态融合算法实战解析
  • Shuffle SOAR使用学习经验
  • ElasticSearch相关术语介绍
  • 亚远景-ISO 42001:汽车AI安全的行业标准新趋势
  • 华为开源CANN,再次释放“昇腾转向”信号
  • vue3对比vue2的性能优化和提升 :Vue 3 vs Vue 2
  • Java的异常体系
  • hadoop HDFS 重置详细步骤
  • ReAct Agent 原生代码实现(纯Python实现)
  • 【指南版】网络与信息安全岗位系列(三):安全运维工程师
  • 前端技术架构设计文档(Vue2+Antd+Sass)
  • 关于AI应用案例计算机视觉、自然语言处理、推荐系统和生成式AI四大领域的详细技术分析。
  • Java垃圾回收(GC)探析
  • 护网行动之后:容器安全如何升级?微隔离打造内网“微堡垒”
  • 【智能协同云图库】第六期:基于 百度API 和 Jsoup 爬虫实现以图搜图
  • 时间复杂度和空间复杂度Java语言描述
  • 【渲染流水线】[应用阶段]-[渲染命令队列]以UnityURP为例
  • AutoMQ-Kafka的替代方案实战
  • 如何在 Ubuntu 24.04 中永久更改主机名
  • zookeeper因jute.maxbuffer启动异常问题排查处理
  • 【macOS操作系统部署开源DeepSeek大模型,搭建Agent平台,构建私有化RAG知识库完整流程】
  • 29-数据仓库与Apache Hive-创建库、创建表
  • MT信号四通道相关性预测的Informer模型优化研究
  • Linux中Docker Swarm实践
  • 手机控制断路器:智能家居安全用电的新篇章