fragment生命周期

onAttach()始终在任何Lifecycle 状态更改之前调用,所以onAttach()在onCreate()之前调用。
onAttach():
Fragment被附加到Activity时调用。在这个阶段,Fragment可以获取Activity的上下文。
onCreate():
- 在
Fragment创建时调用。通常用于初始化一些非 UI 相关的逻辑,比如创建 ViewModel 或准备数据。 - 初始化与Fragment视图无关的变量
onCreateView():
- 为
Fragment创建并返回其关联的视图。在此阶段,可以通过LayoutInflater创建和配置Fragment的 UI。
onViewCreated():
- 当
Fragment的视图被创建后调用。在这个方法中,你可以执行与视图相关的逻辑,比如设置监听器、初始化数据等。 - 初始化视图内各个控件
onStart():
- 当
Fragment对用户可见时调用。此时,Fragment的 UI 还在后台,未完全显示。
onResume():
- 当
Fragment完全对用户可见并可以交互时调用。这是Fragment活跃状态的开始。
可以对Lifecycle进行监听 然后做一些操作
@Override
public void onAttach(@NonNull @NotNull Context context) {
super.onAttach(context);
//requireActivity() 返回的是宿主activity
requireActivity().getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull @NotNull LifecycleOwner source, @NonNull @NotNull Lifecycle.Event event){
if (event.getTargetState() == Lifecycle.State.CREATED){
//在这里任你飞翔
requireActivity().getLifecycle().removeObserver(this); //这里是删除观察者
}
}
});
}
使用FragmentTransaction-生命周期与页面跳转
1.当你使用 FragmentTransaction 在同一个 Activity 中切换 Fragment 时,生命周期的表现取决于你是使用 replace 还是 add / hide / show。
replace() 示例:
- 当你使用
replace()切换Fragment时,旧的Fragment会完全被销毁,新Fragment会按照全新的生命周期开始。
例如:从 FragmentA 切换到 FragmentB:
FragmentA:onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()FragmentB:onAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onStart() -> onResume()
add() / hide() / show() 示例:
- 如果你使用
add()、hide()和show()进行Fragment切换,Fragment并不会被销毁,而是只是进入不可见状态。
例如:从 FragmentA 切换到 FragmentB:
FragmentA:onPause() -> onStop()(不会销毁视图)FragmentB:onAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onStart() -> onResume()- 如果你再切换回
FragmentA,它会调用:onStart() -> onResume()
2.Fragment 跳转到另一个 Activity:
当你从一个 Fragment 进行页面跳转,启动新的 Activity 时,当前 Fragment 会进入暂停和停止阶段,但通常不会被销毁。
例如,从 FragmentA 启动 ActivityB:
FragmentA:onPause() -> onStop()(仍然保留视图,等待用户返回)
当用户从 ActivityB 返回时:
FragmentA:onStart() -> onResume()
按下返回键回到之前的 Fragment:
如果你在 FragmentTransaction 中将操作加入回退栈(addToBackStack()),当你按下返回键时,前一个 Fragment 会被重新显示,而当前 Fragment 则被销毁或隐藏,具体取决于之前的切换方式。
例如:从 FragmentB 返回到 FragmentA:
FragmentB:onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()FragmentA:onStart() -> onResume()
使用Jetpack 的 Navigation 组件-生命周期与页面跳转
Navigation 通过导航图 (NavGraph) 和 NavController 来管理 Fragment 的跳转和状态。
1.从一个 Fragment 导航到另一个 Fragment
假设从 FragmentA 导航到 FragmentB。
FragmentA -> FragmentB 的生命周期:
-
FragmentA的生命周期变化:onPause(): 当FragmentA开始从前台离开(但仍然可见),会调用此方法。onStop(): 当FragmentB成功展示后,FragmentA将进入后台,此时FragmentA不再可见。
使用
Navigation组件时,FragmentA通常不会被销毁(即onDestroyView()和onDestroy()不会立即被调用),而是保留在内存中。如果返回到FragmentA,它会直接从onStart()和onResume()恢复。 -
FragmentB的生命周期变化:onAttach():FragmentB被添加到Activity上时调用。onCreate(): 在FragmentB初始化时调用。onCreateView(): 为FragmentB创建视图。onViewCreated(): 当视图创建完成后,执行与 UI 相关的逻辑。onStart():FragmentB开始进入前台并对用户可见。onResume():FragmentB完全对用户可见并开始交互。
2.当从 FragmentB 返回到 FragmentA(假设 FragmentA 已加入回退栈)时:
FragmentB的生命周期变化:onPause(): 当FragmentB开始离开前台时调用。onStop(): 当FragmentA成功展示后,FragmentB进入后台。onDestroyView(): 当FragmentB的视图被销毁时调用。FragmentB通常会调用onDestroyView(),但在某些情况下它的实例可能保留在内存中,直到系统需要回收内存。onDestroy()和onDetach(): 当FragmentB完全从Activity中移除时调用。
FragmentA的生命周期变化:onStart(): 当返回到FragmentA后,它的视图开始可见。onResume(): 当FragmentA完全恢复到前台并开始交互。- 如果
Fragment被回收(如系统内存紧张),当再次导航回该Fragment时,Fragment会重新创建,调用onCreate()和onCreateView()等方法。
自动管理回退栈:Jetpack Navigation 自动处理导航和回退,不需要手动调用 addToBackStack() 和 popBackStack()。

![[大模型]Conda在线安装-Langchain-Chatchat-V0.3](https://img-blog.csdnimg.cn/img_convert/211ee84d11ecab2cf8ae80e15aab7ed6.png)

















