您现在的位置是:首页 > 文章详情

Android面试题库 - Fragment(一) - 基础

日期:2018-09-01点击:355

Fragment为什么成为第五大组件

Fragment为什么成为第五大组件

四大组件:Activity、Service、Broadcast Receiver、Content Provider

Fragment具有生命周期,使用广泛

Fragment加载到Activity的两种方式

  • xml通过fragment标签引入的方式
  • code中动态添加

FragmentPagerAdapter和FragmentStatePagerAdapter

  • FragmentPagerAdapter的destroyItem的时候并没有直接销毁item,只是分离了UI
  • FragmentStatePagerAdapter是直接销毁了Fragment
  • Fragment多的时候选择FragmentStatePagerAdapter,少的时候选择FragmentPagerAdapter

Fragment的生命周期

img_9775c572c621d806b121dd809cd03fb0.jpe
Fragment生命周期
img_d921740c2bda339e6de3692f70907386.jpe
Activity生命周期对Fragment生命周期的影响

Framgnet之间的通信

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

Framgnt管理器:FragmentManger

如何获取FragmentManger

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

常用方法

  • add 添加一个Fragment实例
  • remove 移除一个Fragment实例
  • replace 替换一个Fragment实例

ViewPager加载Fragment如何实现页面可见再加载数据

ViewPager是默认缓存1的pager,也就是默认加载隔壁的Fragment。而mOffscreenPageLimit这是默认为1的,且setOffscreenPageLimit传入的数据小于1也会默认赋值为1。以下是两种实现方式:

从ViewPaer

  • 重写整个ViewPager,将mOffscreenPageLimit赋值为0
  • 通过反射获取mOffscreenPageLimit的值,然后进行赋值

从Fragment

  • 定义isCreate变量默认为false
  • 在onCreate方法中赋值为true
  • 重写setUserVisibleHint方法,代码如下
override fun setUserVisibleHint(isVisibleToUser: Boolean) { super.setUserVisibleHint(isVisibleToUser) if (isVisibleToUser && isCreate) { isCreate = false // todo you something } } 
  • ViewPager的mOffscreenPageLimit设置为mFragments的大小
  • 需要注意:第0个Framgnet不能使用上面的方法,需要特殊处理,onCreate中判断Fragment的下标赋值isCreate的值

如何获得Fragment的实例

  • 保留空构造方法,否则会在某些情况下抛出错误:make sure class name exists, is public, and has an empty constructor that is public
  • 不要直接不要直接通过new的方式获取,应该使用:newInstance方式来获取,以下是kotlin示例:
companion object { /** * 获取PartyBillHandledFragment的实例 */ fun newInstance(): PartyBillHandledFragment { val args = Bundle() val fragment = PartyBillHandledFragment() fragment.arguments = args return fragment } } 

startActivityForResult之坑

  • 在Fragment中请勿使用getActivity().startActivityForResult(),这样Framgnet中的onActivityResult是接收不到回调,而是回调Activity的onActivityResult。
  • 正确的应该是直接使用startActivityForResult()方法
  • requestCode请勿传-1
原文链接:https://yq.aliyun.com/articles/641041
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章