01. Kotlin 基础语法
Kotlin 是 JetBrains 开发的现代 JVM 语言,现在是 Android 开发的官方语言。var 声明可变变量,val 声明不可变(推荐用 val)。类型写在冒号后面,变量名前面。分号可写可不写。字符串模板用 $var 或 ${expr}。空安全是杀手特性,? 后缀表示可空类型。
kotlin
fun main() {
// 变量
val name: String = "小明"
var age = 18 // 类型推断
// 字符串模板
println("你好, $name, 你${age + 1}岁了")
// 空安全
var nullable: String? = null
val length = nullable?.length ?: 0 // Elvis 操作符给默认值
// nullable!!.length // 强制解包,如果是 null 就崩
// when 表达式
val grade = when (age) {
in 0..6 -> "幼儿"
in 7..17 -> "学生"
else -> "成人"
}
// 数据类 - 一行搞定
data class User(val name: String, val email: String)
}Elvis 操作符 ?: 是 Kotlin 最好用的特性之一,给可空值提供默认值的简洁写法。
02. Activity 生命周期
Activity 是 Android 的一个页面,有自己的生命周期。onCreate 创建时调用(只一次),onStart 可见但不在前台,onResume 在前台可交互,onPause 暂停(如弹窗覆盖),onStop 完全不可见,onDestroy 销毁。理解生命周期是写 Android 的基础,不然各种闪退。
kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
println("onCreate - 创建")
}
override fun onStart() {
super.onStart()
println("onStart - 可见了")
}
override fun onResume() {
super.onResume()
println("onResume - 可以交互了")
}
override fun onPause() {
super.onPause()
println("onPause - 失去焦点")
// 保存临时数据
}
override fun onStop() {
super.onStop()
println("onStop - 不可见了")
}
override fun onDestroy() {
super.onDestroy()
println("onDestroy - 销毁")
}
}旋转屏幕时 Activity 会重建(销毁再创建),要注意保存状态。
03. RecyclerView 列表
RecyclerView 是 Android 上显示长列表的标准组件,比旧的 ListView 高效很多因为它会回收复用的 item 视图。需要一个 Adapter 提供数据和创建 ViewHolder,一个 LayoutManager 决定排列方式(线性、网格、瀑布流)。配合 ViewBinding 写起来比 findViewById 舒服。
kotlin
// Adapter
class UserAdapter(
private val users: List<User>,
private val onItemClick: (User) -> Unit
) : RecyclerView.Adapter<UserAdapter.ViewHolder>() {
class ViewHolder(binding: ItemUserBinding) : RecyclerView.ViewHolder(binding.root) {
val nameText = binding.nameText
val emailText = binding.emailText
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemUserBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val user = users[position]
holder.nameText.text = user.name
holder.emailText.text = user.email
holder.itemView.setOnClickListener { onItemClick(user) }
}
override fun getItemCount() = users.size
}
// 使用
recyclerView.adapter = UserAdapter(users) { user ->
Toast.makeText(this, "点击了 ${user.name}", Toast.LENGTH_SHORT).show()
}
recyclerView.layoutManager = LinearLayoutManager(this)AsyncListDiffer 可以在列表更新时自动计算差异并优雅地动画刷新,比 notifyDataSetChanged 体验好。
04. ViewModel 和 LiveData
ViewModel 保存 UI 数据,在配置改变(如旋转)时不销毁。LiveData 是可观察的数据容器,数据变化时自动通知 UI 更新。配合 lifecycle 作用域,LiveData 只通知活跃的 UI,不用担心内存泄漏。这是 Android 推荐的架构组件。
kotlin
class MainViewModel : ViewModel() {
private val _users = MutableLiveData<List<User>>()
val users: LiveData<List<User>> = _users
fun loadUsers() {
viewModelScope.launch {
// 模拟网络请求
val result = fetchUsersFromApi()
_users.value = result
}
}
private suspend fun fetchUsersFromApi(): List<User> {
delay(1000)
return listOf(User("小明", "[email protected]"))
}
}
// Activity 中使用
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.users.observe(this) { users ->
// 数据变化时更新 UI
adapter.submitList(users)
}
viewModel.loadUsers()
}
}viewModelScope 是 ViewModel 自带的协程作用域,ViewModel 销毁时自动取消所有协程。
05. Jetpack Compose 入门(现代 UI)
Compose 是 Android 的现代声明式 UI 工具包,用 Kotlin 代码写 UI。@Composable 函数描述界面,状态变化时自动重组。不再需要 XML 布局文件,UI 和逻辑在同一个 Kotlin 文件里。LazyColumn 替代 RecyclerView,简单到只有几行代码。
kotlin
@Composable
fun UserListScreen() {
var users by remember { mutableStateOf(listOf<User>()) }
LaunchedEffect(Unit) {
users = fetchUsers()
}
Scaffold(
topBar = { TopAppBar(title = { Text("用户列表") }) }
) { padding ->
LazyColumn(contentPadding = padding) {
items(users) { user ->
UserCard(user)
}
}
}
}
@Composable
fun UserCard(user: User) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
.clickable { println("点击: ${user.name}") }
) {
Column(modifier = Modifier.padding(16.dp)) {
Text(user.name, style = MaterialTheme.typography.headlineSmall)
Text(user.email, style = MaterialTheme.typography.bodyMedium)
}
}
}Compose 的 remember 和 LaunchedEffect 配合使用,能实现以前需要多个生命周期方法才能做的事。
知识测验
第 1/4 题正确 0
Kotlin 中 val 和 var 的区别?
下一节
下一节 协程深入