前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android高频面试专题 - 基础篇(二)Fragment

Android高频面试专题 - 基础篇(二)Fragment

作者头像
Android扫地僧
发布2020-03-19 16:12:26
1.3K0
发布2020-03-19 16:12:26
举报
文章被收录于专栏:Android进阶Android进阶

Fragment知识点不多,主要留意下回退栈和懒加载两点就差不多了,前提是其他点你也都掌握了,更多其他完整面试专题,请关注公众号获取。

1、简要介绍下Fragment

Fragment是Activity中用户界面的一个行为或者是一部分。主要是支持在大屏幕上动态和更为灵活的去组合或是交换UI组件,通过将Activity的布局分割成若干个Fragment,可以在运行时编辑Activity的呈现,并且那些变化会被保存在由Activity管理的后台栈里面。

是Android 3.0(API 11)提出的,为兼容低版本,v4包中也开发了一套Fragment API,现已移到androidx维护。

2、Fragment生命周期

Fragment比Activity多了几个生命周期的回调方法

  • onAttach(): 当该Fragment被添加到Activity时被回调,该方法只会被调用一次。
  • onCreateView(): 每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View组件。
  • onActivityCreated(): 当Fragment所在的Activity被启动完成后回调该方法。
  • onDestroyView(): 销毁该Fragment所包含的View组件时调用。
  • onDetach(): 将该Fragment从Activity中删除、替换完成时回调该方法,在onDestroy()方法后一定会回调onDetach()方法,该方法只会被调用一次。

注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对 于该方法的实现

3、如何获取 FragmentManger

  • Activity 中通过 getSupportFragmentManager获取
  • Fragment 中通过 getChildFragmentManager获取

4、Framgnet 之间的通信

  • Fragment 通过 getActivity 获取到 Activity,Activity通过findFragmentByTag||findFragmentById获取Fragment
  • Fragment 实现接口,Activity 通过接口来管理
  • 两个 Fragment 之间通过广播来传输数据
  • 使用事件总线传递数据,如EventBus

5、FragmentPagerAdapter 和 FragmentStatePagerAdapter

fragmentPagerAdapter在destroyItem()的时候调用的是detach()方法,只是把UI进行了分离,并没有真正的移除fragment,所以只适用于页面较少的情况。而fragmentStatePagerAdapter在切换页面的时候调用的是remove()方法,是真正回收内存的,所以它适用于页面较多的情况。

6、startActivityForResult 之坑

  • 在 Fragment 中请勿使用 getActivity().startActivityForResult(),这样 Framgnet 中的 onActivityResult 是接收不到回调,而是回调 Activity 的 onActivityResult。
  • 正确的应该是直接使用 startActivityForResult()方法
  • requestCode 请勿传-1

7、数据保存和恢复

和Activity类似,Fragment也有onSaveInstanceState的方法,在此方法中进行保存数据,然后在onCreate或者onCreateView或者onActivityCreated进行恢复都可以。

8、Fragment两种添加方式

  • 直接在XML文件中使用<fragment>标签
  • 在代码中,通过FragmentTransaction动态添加

9、FragmentTransaction常用方法

  • transaction.add() 向Activity中添加一个Fragment
  • transaction.remove() 从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁
  • transaction.replace() 使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体
  • transaction.hide() 隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
  • transaction.show() 显示之前隐藏的Fragment
  • detach() 会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护
  • attach() 重建view视图,附加到UI上并显示
  • ransatcion.commit() 提交事务

10、Fragment回退栈

Activity有任务栈,用户通过startActivity将Activity加入栈,点击返回按钮将Activity出栈。Fragment也有类似的栈,称为回退栈(Back Stack),回退栈是由FragmentManager管理的。默认情况下,Fragment事务是不会加入回退栈的,如果想将Fragment事务加入回退栈,则可以加入addToBackStack("")。如果没有加入回退栈,则用户点击返回按钮会直接将Activity出栈;如果加入了回退栈,则用户点击返回按钮会回滚Fragment事务。

11、后台运行缺陷

你的应用由FragmentA切换到FragmentB,被置于后台(例如用户点击了home),长时间后你会发现当你再次通过home打开时,上面FragmentA与FragmentB叠加在一起,或者横竖屏切换时,解决办法是只有在savedInstanceState==null时,才进行创建Fragment实例,通过检查onCreate的参数Bundle savedInstanceState就可以判断,当前是否发生Activity的重新创建。

12,ViewPager + Fragment懒加载实现

假如ViewPager的每一个Fragment都需要通过网络拉取数据加载,而ViewPager是默认加载前两项的,并且只要Activity执行了onResume(), 所有ViewPager中的Fragment都会执行onResume(),所以在很容易造成网络丢包或者网络堵塞等问题,所以Fragment使用懒加载机制,只有当Fragment真正对用户可见时,才进行网络请求。

实现方式是在setUserVisibleHint(boolean isVisibleToUser) 方法中进行判断是否对用户可见,并且保证UI已经初始化onViewCreated(),才开始拉取数据。

详情参考Fragment懒加载

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android扫地僧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
事件总线
腾讯云事件总线(EventBridge)是一款安全,稳定,高效的云上事件连接器,作为流数据和事件的自动收集、处理、分发管道,通过可视化的配置,实现事件源(例如:Kafka,审计,数据库等)和目标对象(例如:CLS,SCF等)的快速连接,当前 EventBridge 已接入 100+ 云上服务,助力分布式事件驱动架构的快速构建。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档