Fragment 深入理解——Fragment(一)

📅 2026/8/2 1:24:02
Fragment 深入理解——Fragment(一)
Fragment系列文章带你深入理解Fragment的工作机制、类结构Fragment 深入理解——Fragment一四种commit使用细节及源码分析——Fragment二Fragment 架构与主流程解析——Fragment三Fragment的基本用法请查看官方文档一、Fragment生命与Activity生命周期关系下面看下Fragment的生命周期图Fragment的生命周期看起来跟Activity很相似一个关键的区别在于fragment的生命周期方法是由Activity托管的而不是操作系统调用的因为操作系统无法得知Activity管理的fragment。onViewCreated()就是上面的onActivityCreated()1.1、Activity的FragmentManager负责调用队列中Fragment的生命周期方法。添加Fragment供FragmentManager管理时,onAttach(Activity)、onCreate(Bundle)以及onCreateView(…)方法会被调用。Activity的onCreate(…)执行后onActivityCreated(…)方法也会被调用。1.2、Fragment真正意义上的onResume和onPauseFragment虽然有onResume和onPause的但是这两个方法是Activity的方法调用时机是与Activity相同就是说即使Fragment没有显示但是他所在的activity显示了Fragment的onResume依然会调用。下面介绍三种情况来检测Fragment是否处于显示状态判断当前fragment是否对用户可见1、ViewPager中嵌套fragment由于ViewPager的预加载效应当从页面1切换到页面2的时候虽然页面3对于用户看不见其实已经把页面3加载出来了会调用页面3的onResume()方法我们可以通过setUserVisibleHint()方法来判断当前fragment是否可见OverridepublicvoidsetUserVisibleHint(booleanisVisibleToUser){super.setUserVisibleHint(isVisibleToUser);try{if(getUserVisibleHint()){//界面可见时initReqUnreadNotice();getCacheSize();}}catch(Exceptione){e.printStackTrace();}}注意此方法只会在不同fragment切换时才会调用如果从fragment跳转到activity是不会调用此方法的是不会调用setUserVisibleHint方法的这时就要根据onResume和onPause方法来判断界面是否显示2、使用replace加载或切换Fragment使用Activity直接引入 或者通过FragmentManager的addFragment或replaceFragment动态载入,只要监听Fragment的onResume和onPause方法就能够判断其显隐。OverridepublicvoidonResume(){super.onResume();updateUserState();}OverridepublicvoidonPause(){super.onPause();//...}3、通过show(Fragment)和hide(Fragment)加载或切换fragment通过FragmentManager的showFragment和hideFragment加载fragment时显示与隐藏fragment隐藏fragment时并没有调用onPause()方法这时需要根据onHiddenChanged方法来判断OverridepublicvoidonHiddenChanged(booleanhidden){super.onHiddenChanged(hidden);if(hidden){//隐藏状态}else{//显示状态}}如果用户直接按home键退出了程序没有对home按键事件进行监听在按home键时调用hideFragment那么onHiddenChanged事实上没有被调用反而是onPause被调用了。所以我们需要针对这样的情况做特殊的处理。比如在home键退出时显示调用一下hideFragment或者在onPause中也发信号说本Fragment不可见了这都是可以的。1.3、在Activity处于停止暂停或运行状态下时添加Fragment会发生什么呢FragmentManager立即驱使Fragment快速跟上Activity的生命周期直到与Activity的最新状态保持同步。例如向处于运行状态的activity中添加fragment时以下fragment生命周期方法会被依次调用onAttach(Activity)、onCreate(Bundle)、onCreateView(…)、onActivityCreated(Bundle)、onStart(),onResume()方法。只要Fragment的状态与Activity的状态保持了同步Activity的FragmentManager便会继续调用其他生命周期方法以继续保持Fragment与Activity的状态一致而几乎就在同时Activity接受到了从操作系统发出的相应调用。但Fragment方法究竟是在Activity方法之前还是之后调用的这一点却是无法保证的哦二、添加Fragment官方文档Creating a Fragment构建灵活的 UI2.1、在运行时向 Activity 添加Fragment如果您计划在 Activity 的生命周期内更改片段如需执行添加或移除片段等事务您必须使用 FragmentManager 创建 FragmentTransaction后者将提供添加、移除、替换片段以及执行其他片段事务所需的 API。FragmentManagerFragmentManager是负责管理fragment的将fragment添加到activity视图层级结构中、移除、隐藏等等操作都是通过这个类来进行的。针对在一个Activity中的某个Layout中切换Fragment,两种方法1使用replace方法把原有的Fragment替换掉2使用hide和show方法把已经添加过的Fragment再次显示出来。这两种方法区别以及其生命周期的调用可参考下面两篇文章[Android]Fragment加载替换add,show,hide,replace方法从Fragment被销毁看replace和add的区别2.2、布局文件中向 Activity 添加Fragment在xml中使用 fragment 元素进行定义这样添加的Fragment 不能在运行时进行remove操作三、Fragment 分类分为android.app.Fragment和android.support.v4.app.Fragment下面来详细讲解一下这两个类的区别3.1、在Fragment中获取FragmentManager只能使用FragmentManager()3.2、在Activity 中获取FragmentManager 分下面两种情况android.app.Fragment这个类是在Android 3.0API level 11加入的也就是说在Android 3.0以后的Activity知道如何管理Fragment1、使用getFragmentManager()获取 FragmentManagerandroid.support.v4.app.Fragment为了使Android 3.0以前的系统也能使用Fragment在 Support Library 引入了Fragment。使用该类需要注意两点1、Activity必须继承android.support.v4.app.FragmentActivity2、使用getSupportFragmentManager()获取 FragmentManager结论使用哪个的Fragment需要注意使用对应的Activity和获取FragmentManager方式。如果Activity A所在app的targetSdkVersion是api 11及以上并且运行在api 11及以上的系统上那么它可以使用android.app.Fragment。如果Activity A也是继承自FragmentActivity那么它也同时可以使用android.support.v4.app.FragmentActivity。继承AppCompatActivity类现在Android Studio 中新建的activity默认是继承AppCompatActivityAppCompatActivity继承FragmentActivity而现在大多数targetSdkVersion都是api 11及以上。所以可以同时使用这两种Fragment你可能会说既然有标准库了为什么还要使用getSupportFragmentManager()我就遇到这样的一个情况比如使用ViewPager和FragmentPagerAdapter来加载显示Fragment需要的就是FragmentManager它的全包名android.support.v4.app.FragmentManager虽然都是FragmentManager不同的包名就是不同的类了如果你知道标准库里有替代ViewPager的类请在评论里告诉我四、viewpage和Fragment结合使用viewpage可是实现页面的左右滑动viewpage的适配器PagerAdapter里面有四个方法必须实现包含了需要显示页面的数据类似于ListView中的Adapter在viewpage和Fragment结合使用的时候有两个适配器FragmentPagerAdapter 和 FragmentStatePagerAdapter它们继承了PagerAdapter。它们之间的差别参考下面第2个1.Android ViewPager和Fragment实现顶部导航界面滑动效果2.Android FragmentViewPager 组合一些你不可不知的注意事项下面两篇文章介绍了ViewPager 和view的使用3.ViewPager 全面剖析及使用详解4.Android ViewPager使用详解请点赞、收藏感谢大家的支持有任何疑问可在评论区回复参考https://developer.android.com/training/basics/fragments/creating.html浅谈FragmentManager与fragment之一二事【Android】Fragment真正意义上的onResume和onPausegetFragmentManager与getChildFragmentManager解决fragment白屏Fragment 中setUserVisibleHint方法不执行