Android 开发基础:Activity、Fragment 与布局
Android 开发基础:Activity、Fragment 与布局
本文将带你掌握 Android 应用最核心的三个概念:Activity(活动)、Fragment(片段)和布局。它们是构建所有 Android 应用界面的基石。如果你是零基础开发者,跟着这篇教程你将学会如何创建页面、拆分界面模块以及编排界面元素。
一、Activity:应用的门面
Activity 是 Android 应用的一个独立界面,几乎每个可见的屏幕都是一个 Activity。它负责与用户交互、接收输入和展示信息。
1. 创建 Activity
在 Android Studio 中,新建 Activity 需要完成两步:
- 创建一个继承自
Activity(或AppCompatActivity)的类; - 在
AndroidManifest.xml中声明该 Activity。
// MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) // 绑定布局
}
}
2. Activity 生命周期
Activity 有完整的生命周期回调,理解它们对管理资源至关重要。核心回调顺序如下:
- onCreate():只调用一次,做初始化工作(绑定布局、初始化视图等)。
- onStart() :Activity 即将可见。
- onResume() :Activity 已处于前台并可交互。
- onPause() :Activity 失去焦点但仍部分可见(例如弹出对话框时),应暂停动画、释放轻量资源。
- onStop() :Activity 完全不可见,可释放重资源。
- onDestroy() :Activity 被销毁前调用,做最终清理。
- onRestart() :从停止态恢复到活动态时调用。
示例:视频播放器在
onPause()中暂停播放,在onResume()中恢复播放。
3. Intent:Activity 之间的信使
启动另一个 Activity 或传递数据都需要使用 Intent。
- 显式 Intent:明确指定目标 Activity 的类名。
val intent = Intent(this, SecondActivity::class.java) intent.putExtra("key", "值") startActivity(intent) - 隐式 Intent:指定动作(如 ACTION_VIEW),由系统匹配能够响应的组件(例如打开网页)。
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com")) startActivity(intent)
目标 Activity 中可通过 intent.getStringExtra("key") 获取传递的数据。
二、Fragment:模块化界面片段
Fragment 是依附于 Activity 的子界面模块,拥有自己的布局和生命周期。它特别适合构建灵活的 UI(如平板双栏布局)以及模块化复用。
1. 创建 Fragment
创建一个类继承 Fragment,并绑定布局:
class MyFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_my, container, false)
}
}
2. 在 Activity 中添加 Fragment
使用 FragmentManager 和 FragmentTransaction 动态添加:
supportFragmentManager.beginTransaction()
.add(R.id.fragment_container, MyFragment())
.commit()
注意 XML 中的 fragment_container 一般是一个 FrameLayout 容器。
3. Fragment 生命周期
Fragment 有自己的生命周期,与 Activity 生命周期关联:
- onAttach() :Fragment 绑定到 Activity 时调用。
- onCreateView() :创建 Fragment 的视图。
- onViewCreated() :视图创建完毕后立即调用,适合做界面初始化。
- onActivityCreated() :宿主 Activity 的
onCreate()已完成。 - onDestroyView() :视图被移除时调用,用于清理视图相关资源。
- onDetach() :Fragment 与 Activity 解绑。
理解 Fragment 生命周期对于正确处理数据保存、避免内存泄漏非常重要。例如,在 onDestroyView() 中取消网络请求或移除监听。
4. Fragment 间通信
推荐使用共享 ViewModel 或通过 Activity 作为桥梁。避免 Fragment 之间直接引用。
// 共享 ViewModel 示例
val sharedViewModel: SharedViewModel by activityViewModels()
sharedViewModel.selectedItem.observe(viewLifecycleOwner) { item ->
// 更新 UI
}
三、布局:定义界面外观
Android 使用 XML 定义布局,放置各种 View 和 ViewGroup。布局文件存放在 res/layout/ 目录中。
1. 常用 ViewGroup(布局容器)
- LinearLayout:水平或垂直排列子视图,使用
android:orientation="vertical|horizontal"。 - RelativeLayout:子视图根据父容器或其他子视图的相对位置排列,灵活性高但性能较差。
- FrameLayout:最简单的布局,子视图堆叠显示,通常作为 Fragment 容器。
- ConstraintLayout(推荐):用扁平视图树通过约束定位子视图,性能更优且复杂布局易维护。
2. ConstraintLayout 入门示例
每个子视图需要至少一个水平约束和一个垂直约束(如相对于父容器)。
<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">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
</androidx.constraintlayout.widget.ConstraintLayout>
3. 常用 View(控件)
- TextView:显示文本。
- EditText:文本输入框。
- Button:可点击按钮。
- ImageView:显示图片。
- RecyclerView:用于显示大量可滚动列表(需适配器)。
在 Activity 或 Fragment 中引用布局文件内的视图需通过 findViewById(Kotlin 合成已废弃,推荐 View Binding 或手动查找):
val button = findViewById<Button>(R.id.button)
button.setOnClickListener { /* 处理点击 */ }
四、构建你的第一个页面:组合实践
我们通过一个简单例子串联 Activity、Fragment 和布局。
需求:一个页面,上方显示一个按钮,点击后切换两个 Fragment 显示不同文字。
- 主布局 activity_main.xml(使用 ConstraintLayout):
<androidx.constraintlayout.widget.ConstraintLayout ...>
<Button
android:id="@+id/btn_switch"
android:text="切换Fragment"
... />
<FrameLayout
android:id="@+id/fragment_container"
...
app:layout_constraintTop_toBottomOf="@id/btn_switch" />
</...>
-
两个 Fragment 的布局(fragment_a.xml 和 fragment_b.xml,各含一个 TextView)。
-
FragmentA 与 FragmentB:在
onCreateView中传入对应布局。 -
MainActivity 逻辑:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btnSwitch = findViewById<Button>(R.id.btn_switch)
btnSwitch.setOnClickListener {
val fragment = if (it.tag == "A") FragmentB().also { it.tag = "B" }
else FragmentA().also { it.tag = "A" }
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit()
}
// 初始加载 FragmentA
supportFragmentManager.beginTransaction()
.add(R.id.fragment_container, FragmentA().also { it.tag = "A" })
.commit()
}
}
五、总结与学习建议
- Activity 管理整屏交互,通过 Intent 跳转和传数据。
- Fragment 将大屏幕拆成可复用的模块,生命周期依赖宿主 Activity。
- 布局 通过 XML 编排界面组件,
ConstraintLayout是当下主流选择。
后续学习建议:
- 掌握
RecyclerView实现列表。 - 学习
ViewModel和LiveData进行生命周期感知的数据管理。 - 熟悉
Navigation组件简化 Fragment 导航。
动手实践这些概念,你将能够快速构建出具有清晰结构和流畅体验的 Android 应用。现在就打开 Android Studio,创建一个项目开始练习吧!