Android之Fragment总结篇

1. Fragment为什么会被称为第五大组件?

Android中的4大组件为:Activity,Broadcast,Service,ContentProvider,那么为什么Fragment可以称之为第5大组件呢?
>因为Fragment有生命周期,使用频率不输于4大组件,可灵活加载到Activity中。然后谈论谈论Fragment如何加载到Activity中:

1.1 Fragment加载到Activity的2种方式

1.1.1 静态加载

静态加载:直接在Activity布局文件中指定Fragment。使用指定属性name即可,代码如下所示:

<fragment
android:name="com.example.myfragment.MyFragment"
android:id="@+id/myfragment_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/> 

1.1.2 动态加载

动态加载:在 java 代码中动态加载,需要使用到FragmentManager;

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
//将FragmentA从容器中移除掉,减少内存的消耗
fragmentTransaction.remove(fragmentA);
fragmentTransaction.add(R.id.fragment_layout,new FragmentB());
fragmentTransaction.commit();

1.2 Fragment与ViewPager的搭配使用

通常情况下我们开发应用最常见的使用情况是 TabLayout+ViewPager+Fragment 的使用方式,

这就涉及到两个常用的适配器的使用,一个是FragmentPagerAdapter,另外一个是 FragmentStatePagerAdapter,那么它们之间有什么异同呢?

相同点 :二者都继承 PagerAdapter

不同点 :FragmentPagerAdapter 的每个 Fragment 会持久的保存在FragmentManager 中,只要用户可以返回到页面中,它都不会被销毁。因此适用于那些 数据相对静态的页,Fragment数量也比较少的那种;

FragmentStatePagerAdapter 只保留当前页面,当页面不可见时,该Fragment 就会被消除,释放其资源。因此适用于那些 数据动态性较大、占用内存较多,多Fragment的情况

1.3 Activity 和 Fragment 的区别?

  1. 相似点:都可包含布局、可有自己的生命周期;

  2. 不同点:

    1. Fragment 相比较于 Activity 多出 4 个回调周期,在控制操作上更灵活;

    2. Fragment 可以在 XML 文件中直接进行写入,也可以在 Activity 中动态添加;

    3. Fragment 可以使用 show() / hide() 或者 replace() 随时对 Fragment 进行切换,并且切换的时候不会出现明显的效果,用户体验会好;Activity 虽然也可以进行切换,但是Activity之间切换会有明显的翻页或者其他的效果,在小部分内容的切换上给用户的感觉不是很好;

2. Fragment的生命周期

特殊情况下的Fragment的生命周期情况:

Fragment

  1. 界面打开
    onCreate() 方法执行!
    onCreateView() 方法执行!
    onActivityCreated() 方法执行!
    onStart() 方法执行!
    onResume() 方法执行!
    
  2. 按下主屏幕键/锁屏
    onPause() 方法执行!
    onStop() 方法执行!
    
  3. 重新打开
    onStart() 方法执行!
    onResume() 方法执行!
    
  4. 按下后退键
    onPause() 方法执行!
    onStop() 方法执行!
    onDestroyView() 方法执行!
    onDestroy() 方法执行!
    onDetach() 方法执行!
    

Activity

  1. 打开应用

    onCreate() 方法执行!
    onStart() 方法执行!
    onResume() 方法执行!
    
  2. 按下主屏幕键/锁屏

    onPause() 方法执行!
    onStop() 方法执行!
    
  3. 重新打开应用

    onRestart() 方法执行!
    onStart() 方法执行!
    onResume() 方法执行!
    
  4. 按下后退键

    onPause() 方法执行!
    onStop() 方法执行!
    onDestroy() 方法执行!
    

2.1 Fragment的生命周期?

  1. Fragment从创建到销毁整个生命周期中涉及到的方法依次为:onAttach()→onCreate()→ onCreateView()→onActivityCreated()→onStart()→onResume()→ onPause()→onStop()→onDestroyView()→onDestroy()→onDetach(),

  2. 其中和Activity有不少名称相同作用相似的方法,而不同的方法有:

    onAttach():当Fragment和Activity建立关联时调用;
    onCreateView():当fragment创建视图调用,在onCreate之后;
    onActivityCreated():当与Fragment相关联的Activity完成onCreate()之后调用;
    onDestroyView():在Fragment中的布局被移除时调用;
    onDetach():当Fragment和Activity解除关联时调用;
    

2.2 开启一个带 Fragment 的 Activity 的生命周期:

  1. 打开

    Fragment onAttach()方法执行
    Fragment onCreate() 方法执行!
    Fragment onCreateView() 方法执行!
    Fragment onViewCreated()方法执行
    Activity onCreate() 方法执行!
    Fragment onActivityCreated() 方法执行!
    Activity onStart() 方法执行!
    Fragment onStart() 方法执行!
    Activity onResume() 方法执行!
    Fragment onResume() 方法执行!
    
  2. 按下主屏幕键/锁屏

    Fragment onPause() 方法执行!
    Activity onPause() 方法执行!
    Fragment onStop() 方法执行!
    Activity onStop() 方法执行!
    
  3. 再次打开

    Activity onRestart() 方法执行!
    Activity onStart() 方法执行!
    Fragment onStart() 方法执行!
    Activity onResume() 方法执行!
    Fragment onResume() 方法执行!
    
  4. 按下后退键

    Fragment onPause() 方法执行!
    Activity onPause() 方法执行!
    Fragment onStop() 方法执行!
    Activity onStop() 方法执行!
    Fragment onDestroyView() 方法执行!
    Fragment onDestroy() 方法执行!
    Fragment onDetach() 方法执行!
    Activity onDestroy() 方法执行!
    

    在这里插入图片描述

3. Fragment的通信

3.1 在Fragment中调用Activity中的方法

Fragment 有个 getActivity() 方法,比如,在MainActivity中的一个Fragment中获取MainActivity的引用,并调用MainActivity的某个方法methodA()方法:

MainActivity mainActivity = (MainActivity) getActivity();
ainActivity.methodA();

3.2 在Activity中调用Fragment的方法

直接接口回调即可调用Fragment的任何可访问的方法。

3.3 在Fragment中调用另外一个Fragment的方法

间接通过Activity来进行调用。

4. Fragment的切换

Fragmen t的切换方式分为add() & remove() , hide() & show() , detach() & attach()
replace() 方法,其实是先调用了 remove() 然后再调用 add() 方法,所以不算那三种其实之一。

那么这三种方式有什么区别呢?

  1. add() & remove()
    就是添加和移除,因此 replace() 这个方法只是在上一个 Fragment 不再需要时采用的简便方法。

  2. hide() & show() 是指隐藏和显示,
    这种方式防止 Fragment 多次创建实例对象,所以正确的切换方式是 add(),切换时 hide(),add() 另一个 Fragment;再次切换时,只需hide()当前,show()另一个,这样就能做到多个Fragment切换不重新实例化。

  3. detach() & attach()呢?——这种方式极少使用
    使用 detach() 会将 view 从 ViewTree 中删除,和 remove() 不同,此时 Fragment 的状态依然保持着,在使用 attach() 时会再次调用 onCreateView() 来重绘视图,
    注意使用 detach() 后 Fragment.isAdded() 方法将返回false,在使用attach() 还原 Fragment 后 isAdded() 会依然返回 false (需要再次确认) 执行 detach() 和 replace() 后要还原视图的话, 可以在相应的 Fragment 中保持相应的view,并在 onCreateView() 方法中通过 view 的 parent 的 removeView() 方法将 view和parent 的关联删除后返回,

4.1 Fragment中add与replace的区别(Fragment重叠)

  1. add 不会重新初始化 fragment,replace 每次都会。所以如果在 fragment 生命周期内获取获取数据,使用 replace 会重复获取;

  2. 添加相同的 fragment 时,replace 不会有任何变化,add 会报IllegalStateException 异常;

  3. replace 先 remove 掉相同 id 的所有 fragment,然后在 add 当前的这个 fragment,而 add 是覆盖前一个 fragment。所以如果使用 add 一般会伴随 hide() 和 show(),避免布局重叠;

  4. 使用 add,如果应用放在后台,或以其他方式被系统销毁,再打开时, hide() 中引用的 fragment 会销毁,所以依然会出现布局重叠 bug,可以使用 replace 或使用 add 时,添加一个 tag 参数;
    在这里插入图片描述

5. getFragmentManager、getSupportFragmentManager 、getChildFragmentManager之间的区别?

  1. getFragmentManager() 所得到的是所在 fragment 的父容器的管理器, getChildFragmentManager() 所得到的是在 fragment 里面子容器的管理器, 如果是 fragment 嵌套 fragment,那么就需要利用 getChildFragmentManager();

  2. 因为 Fragment 是 3.0 Android 系统 API 版本才出现的组件,所以 3.0 以上系统可以直接调用 getFragmentManager() 来获取 FragmentManager() 对象,而3.0以下则需要调用 getSupportFragmentManager() 来间接获取;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liusaisaiV1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值