Activity 和 Fragment:UI 开发利器
Activity 生命周期:理解和管理应用状态
Activity 是 Android 应用的基本构建块,是用户交互的窗口。它拥有一个生命周期,定义了 Activity 从创建到销毁的各个阶段,理解这些阶段对于正确管理 Activity 状态和资源至关重要。
Activity 生命周期的主要阶段:
- onCreate(): Activity 被创建时调用,用于初始化 UI 组件和数据。
- onStart(): Activity 对用户可见时调用,用于启动动画和加载数据。
- onResume(): Activity 位于前台,用户可以与其交互时调用。
- onPause(): Activity 失去焦点,但仍在后台运行时调用。
- onStop(): Activity 完全不可见时调用,用于保存数据和释放资源。
- onDestroy(): Activity 被销毁时调用,用于清理资源和释放内存。
示例:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 初始化 UI 组件
val textView = findViewById<TextView>(R.id.text_view)
textView.text = "onCreate called!"
}
override fun onStart() {
super.onStart()
// 启动动画
// 加载数据
}
override fun onResume() {
super.onResume()
// 更新 UI
}
override fun onPause() {
super.onPause()
// 保存数据
}
override fun onStop() {
super.onStop()
// 释放资源
}
override fun onDestroy() {
super.onDestroy()
// 清理资源和释放内存
}
}
Fragment:构建动态 UI 界面
Fragment 是 Activity 的一个组件,用于构建可复用、模块化的 UI 部分。它们可以轻松地被添加到 Activity 中,并可以在运行时动态地添加、删除或替换。
Fragment 的优势:
- 模块化: 将 UI 分解成多个独立的模块,提高代码可读性和可维护性。
- 复用: Fragment 可以被多个 Activity 复用,减少代码重复。
- 动态性: 可以动态地添加、删除和替换 Fragment,提供更灵活的 UI 设计。
Fragment 的生命周期:
Fragment 也有自己的生命周期,与 Activity 的生命周期密切相关。它包括以下几个关键方法:
- onAttach(): Fragment 与 Activity 绑定时调用。
- onCreate(): Fragment 被创建时调用,用于初始化 UI 组件和数据。
- onCreateView(): Fragment 需要绘制视图时调用,用于创建 Fragment 的布局。
- onViewCreated(): Fragment 的视图被创建后调用,用于初始化视图。
- onActivityCreated(): Activity 被创建后调用。
- onStart(): Fragment 对用户可见时调用。
- onResume(): Fragment 处于活动状态时调用。
- onPause(): Fragment 失去焦点时调用。
- onStop(): Fragment 完全不可见时调用。
- onDestroyView(): Fragment 的视图被销毁时调用。
- onDestroy(): Fragment 被销毁时调用。
- onDetach(): Fragment 与 Activity 解绑时调用。
示例:
class MyFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 加载 Fragment 的布局
return inflater.inflate(R.layout.fragment_my, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 初始化 Fragment 的 UI 组件
val textView = view.findViewById<TextView>(R.id.text_view)
textView.text = "Fragment onViewCreated!"
}
}
Fragment 管理:使用 FragmentManager
FragmentManager 是一个强大的工具,用于管理 Activity 中的 Fragment。它提供以下方法:
- findFragmentById(id: Int): Fragment?:通过 ID 获取 Fragment。
- beginTransaction(): FragmentTransaction:创建一个 FragmentTransaction 对象,用于执行 Fragment 操作。
FragmentTransaction 用于执行 Fragment 操作,包括:
- add(containerViewId: Int, fragment: Fragment): FragmentTransaction:将 Fragment 添加到 Activity。
- replace(containerViewId: Int, fragment: Fragment): FragmentTransaction:用新 Fragment 替换现有 Fragment。
- remove(fragment: Fragment): FragmentTransaction:从 Activity 中移除 Fragment。
- addToBackStack(name: String?): FragmentTransaction:将 Fragment 操作添加到返回栈。
- commit(): 提交 Fragment 操作。
示例:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 使用 FragmentManager 添加 Fragment
val fragmentManager = supportFragmentManager
val transaction = fragmentManager.beginTransaction()
transaction.add(R.id.fragment_container, MyFragment())
transaction.commit()
}
}
实战案例:动态加载 Fragment
以下案例展示了如何使用 FragmentManager 动态加载不同的 Fragment:
布局文件 (activity_main.xml):
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Activity 代码 (MainActivity.kt):
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
class MainActivity : AppCompatActivity() {
private lateinit var fragmentManager: FragmentManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fragmentManager = supportFragmentManager
// 初始加载第一个 Fragment
loadFragment(HomeFragment())
}
private fun loadFragment(fragment: Fragment) {
val transaction: FragmentTransaction = fragmentManager.beginTransaction()
transaction.replace(R.id.fragment_container, fragment)
transaction.commit()
}
}
Fragment 代码 (HomeFragment.kt):
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
class HomeFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_home, container, false)
}
}
Fragment 代码 (ProfileFragment.kt):
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
class ProfileFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_profile, container, false)
}
}
通过以上代码,我们可以通过按钮或其他事件触发 loadFragment 函数,动态地加载不同的 Fragment,从而实现 UI 的动态切换。
总结
本文介绍了 Kotlin Activity 和 Fragment 的基础知识,以及如何利用它们构建动态的 Android UI 界面。理解 Activity 生命周期和 Fragment 的生命周期,并熟练运用 FragmentManager 管理 Fragment,是开发 Android 应用的关键。希望本文能够帮助你更好地理解和使用 Activity 和 Fragment,开发出功能强大、用户体验良好的 Android 应用。