1. 引言
在 Android 中,一个 Activity 就是一个页面。
以微信为例,使用 Android 的小伙伴如果注意观察的话,当我们进入朋友圈时,会有从右侧滑入新页面 的层次效果;当退出时,会有向右滑出页面显示出旧页面的效果,今日头条,QQ 等 App 也有这种效果。
但在我的 ,联系人 等页面切换时,却没有这种效果,而是直接切换出对应页面 。前者就是平时所用的 Activity。而后者,就是本文要讲的组件------Fragment。
|----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| fragment 切换 | activity 切换 |
| |
|
在 Android 应用开发中,Fragment
是一个至关重要的 UI 组件,它代表了 Activity
生命周期内的一个具有独立行为和用户界面的模块化片段 。自引入以来,Fragment
已成为构建灵活、可复用且适应性强的用户界面的核心工具,尤其在响应式设计和现代导航架构中扮演着不可或缺的角色。
2. Fragment
生命周期
由于 Fragment
依附于 Activity
,故Fragment
生命周期直接受其宿主 Activity
状态的影响,但也能在 Activity
生命周期内管理自身的视图和数据。
- 当一个
Fragment
所关联的Activity
正处于运行状态(可见且栈顶)时,该Fragment
也处于运行状态。 - 当一个
Activity
进入暂停状态时(可见非栈顶),与它相关联的Fragment就会进入暂停状态。 - 当一个
Activity
进入停止状态时(不可见非栈顶),与它相关联的Fragment
就会进入停止状态,或者通过调用FragmentTransaction
的remove()
、replace()
方法将Fragment
从Activity
中移除,但在事务提交之前调用了addToBackStack()
方法,这时的Fragment
也会进入停止状态。进入停止状态的Fragment
对用户来说是完全不可见的,有可能会被系统回收 Fragment
总是依附于Activity
而存在,因此当Activity
被销毁时,与它相关联的Fragment
就会进入销毁状态 。或者通过调用FragmentTransaction
的remove()
、replace()
方法将Fragment
从Activity
中移除,但在事务提交之前并没有调用addToBackStack()
方法,这时的Fragment
也会进入销毁状态。
Activity 生命周期 单击

onAttach()
:当Fragment
和Activity
建立关联时调用。onCreate()
:onCreateView()
:为Fragment
创建视图(加载布局) 时调用onActivityCreate()
:确保与Fragment
相关联的Activity
创建完毕时调用。onStart()
onResume()
onPasue()
onStop()
onDestroyView()
:与Fragment
关联的视图被移除时调用。onDestroy()
onDetach()
:当Fragment
和Activity
解除关联时调用。
3. Fragment 主要应用
如附录,Fragment 通常用作顶级导航 。其动态刷新页面或页面中的某一部分,而不需要为 Activity Stack
添加新元素。
4. 简单使用
4.1 创建Fragment
LeftFragment
java
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.fragment.databinding.FragmentLeftBinding;
public class LeftFragment extends Fragment {
private FragmentLeftBinding binding;
public LeftFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentLeftBinding.inflate(inflater, container, false);
return binding.getRoot();
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
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:layout_gravity="center_horizontal"
android:text="Button"/>
</LinearLayout>
MainActivity
xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:baselineAligned="false"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main">
<fragment
android:id="@+id/leftFrag"
android:name="com.example.fragment.ui.frament.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
这是最简单的 fragment 的使用,通过在 MainActivity 中添加 fragment 的 View。将其关联至 LeftFragment。随后在定义的 Java 代码中设置相应的 xml。
**Fragment 也是一个非常复杂的体系,这里只做 HelloWorld 级别的介绍 **
5. Activity与Frament通信
在开发时,经常需要在Activity与Fragment直接传递数据。由于 Fragment 是模块化 UI 组件,不能直接操作 Activity 的视图,因此需要通过安全、解耦的方式进行通信。
5.1 Activity -> Fragment
Activity -> Fragment 最简单、直接的通信方式:获得对应Fragment
java
LeftFragment fragment = (LeftFragment) getSupportFragmentManager().findFragmentById(R.id.leftFrag);
if (fragment != null) {
// 调用 LeftFragment 对应方法
}
5.2 Fragment -> Activity
Fragment -> Activity 最简单、直接的通信方式:获得对应Activity
java
MainActivity mainActivity = (MainActivity) getActivity();
if (mainActivity != null) {
// 调用 MainActivity 的方法
}
5.3 Fragment -> Fragment
Fragmeng 直接无法直接通信,通常使用 Activity 或 共享资源 转接。
6. 结论
综上所述,Android 应用中"从右滑入"的页面切换效果通常标志着层级式导航 的开始,传统上由启动新 Activity
实现,现代则常由 Navigation Component
驱动的 Fragment 层级跳转完成。而"直接出现"的效果,则是顶级同级导航 的标志,其背后的技术支柱正是 Fragment
------它使得在单一 Activity
容器内高效、灵活地切换核心功能模块成为可能。理解 Activity
与 Fragment
的分工与协作,以及它们在不同导航场景下的应用,是掌握现代 Android UI 架构的关键。
附录
特征维度 | 层级导航 | 顶级导航 |
---|---|---|
导航目标 | 进入详情页、子功能 (如朋友圈、文章) | 切换核心功能模块 (如"我的"、"联系人") |
典型组件 | 新 Activity |
Fragment |
技术实现 | startActivity() (层级跳转) |
FragmentTransaction.replace() (同级跳转) |
视觉反馈 | 从右滑入/ 向左滑出 | 淡入/ 淡出 或 无动画 |
用户心智 | "进入" -> "返回" (前进/后退栈) | "切换到" (并列、平等的功能区) |
底层结构 | 可能涉及多个 Activity | 通常基于单个 Activity + 多个 Fragment |