Android 开发基础:Activity、Fragment 与布局

FreeGuideOnline 最新 2026-06-17

Android 开发基础:Activity、Fragment 与布局

本文将带你掌握 Android 应用最核心的三个概念:Activity(活动)、Fragment(片段)和布局。它们是构建所有 Android 应用界面的基石。如果你是零基础开发者,跟着这篇教程你将学会如何创建页面、拆分界面模块以及编排界面元素。

一、Activity:应用的门面

Activity 是 Android 应用的一个独立界面,几乎每个可见的屏幕都是一个 Activity。它负责与用户交互、接收输入和展示信息。

1. 创建 Activity

在 Android Studio 中,新建 Activity 需要完成两步:

  1. 创建一个继承自 Activity(或 AppCompatActivity)的类;
  2. 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

使用 FragmentManagerFragmentTransaction 动态添加:

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 显示不同文字。

  1. 主布局 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" />
</...>
  1. 两个 Fragment 的布局(fragment_a.xml 和 fragment_b.xml,各含一个 TextView)。

  2. FragmentA 与 FragmentB:在 onCreateView 中传入对应布局。

  3. 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 实现列表。
  • 学习 ViewModelLiveData 进行生命周期感知的数据管理。
  • 熟悉 Navigation 组件简化 Fragment 导航。

动手实践这些概念,你将能够快速构建出具有清晰结构和流畅体验的 Android 应用。现在就打开 Android Studio,创建一个项目开始练习吧!