Android 面试题之Fragment相关

Fragment的replace和add方法的区别

回答提示

在项目中进行Fragment切换的时候,可以用replaced()方法来切换,也可以用add()。

区别

add是吧一个Fragment添加到一个容器Container中

replace是先remove相同id的所有Fragment,然后在add当前这个Fragment

需要注意

使用replace()切换的话,Fragment都会重新实例化,重新加载数据,如何每次加载的数据都是从网络中获取的,这样就会带来性能的问题。

官方说明:replace()方法,只是在上一个Fragment不在使用时才调用。如果上一个Fragment还需要使用的话,应该使用add()方法切换。

Activity和Fragment生命周期有哪些?

Activity:

onCreate->onStart->onResume->onPause->onStop->onDestroy。

Fragment:

onAttach->onCreate->onCreateView->onActivityCreated>onStart->onResume->onPause->onStop->onDestroyView

Fragment 跟 Activity 之间是如何传值的?

面试经验:

这个问题真实场景经常见,面试官就想看看大家是否有过真实开发经验,大家先说说如何传值,先让面试官感觉大家有经验确实干过,然后在介绍下在真实开发的场景哪里用过,然后也介绍下一般使用EventBus或者RxBus这样让人感觉满满的干货,谈工资也比较好谈,目前开发中用一个activity加载几个fragment是非常常见的,例如:订单中心,主页面架构等等。不可避免的就需要用到activity与fragment之间进行某些值的传递,那么两者之间是如何值传递的呢?

答案解析

当 Fragment 跟 Activity 绑定之后,在 Fragment 中可以直接通过 getActivity()方法获取到其绑定的 Activity 对象,这样就可以调用 Activity 的方法了。在 Activity 中可以通过如下方法获取到 Fragment 实例

FragmentManager fragmentManager=getFragmentManager();
Fragment fragment=fragmentManager.findFragmentByTag(tag);
Fragment fragment=fragmentManager.findFragmentById(id);

获取到 Fragment 之后就可以调用 Fragment 的方法。也就实现了通信功能。

另外也可以调用 fragment.setArguments(Bundle)方法,将数据绑定到 Fragment 域中。
更多资料参考:Activity和Fragment之间的数据通信

描述一下 Fragment 的生命周期

描述一下 Fragment 的生命周期

面试官问这个问题就想看看大家对Fragment是否熟悉,毕竟Fragment用户体验很好,开发经常用,问这个问题还算正常。

日常开发中,fragment的使用是必不可少的,所以它也是基础面试中几乎必问的问题之一。fragment的生命周期和activity类似,有多出来几个生命周期,我们只需要对这几个多出来的生命周期掌握了就可以了,其他的都差不多。


  • onAttach()
    Fragment和Activity建立关联的时候调用,被附加到Activity中去。
  • onCreate()
    系统会在创建Fragment时调用此方法。可以初始化一段资源文件等等。
  • onCreateView()
    系统会在Fragment首次绘制其用户界面时调用此方法。 要想为Fragment绘制 UI,从该方法中返回的 View 必须是Fragment布局的根视图。如果Fragment未提供 UI,您可以返回 null。
  • onViewCreated()
    在Fragment被绘制后,调用此方法,可以初始化控件资源。
  • onActivityCreated()
    当onCreate(),onCreateView(),onViewCreated()方法执行完后调用,也就是Activity被渲染绘制出来后。
  • onPause()
    系统将此方法作为用户离开Fragment的第一个信号(但并不总是意味着此Fragment会被销毁)进行调用。 通常可以在此方法内确认在当前用户会话结束后仍然有效的任何更改(因为用户可能不会返回)。
  • onDestroyView()
    Fragment中的布局被移除时调用。
  • onDetach()
    Fragment和Activity解除关联的时候调用。

ViewPager和Fragment使用过程中会遇到哪些问题

回答提示:

1. 适配器的选择

使用ViewPager加载多个Fragment时,我一般选择FragmentPagerAdapter。

需要大家注意:

  • FragmentPagerAdapter:该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的场景

  • 但是,如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,这时候,我们选择怎么是的适配器呢?

  • 应该使用FragmentStatePagerAdapter

  • FragmentStatePagerAdapter:会把已经创建的Fragment进行保存。会保持Fragment的状态 通过源码分析发现:

  • FragmentStatePagerAdapter这个类抽象出了一个getItem()方法,用于创建对应的Fragment 而FragmentStatePagerAdapter的.instantiateItem()方法实现中,调用了getIitem()方法。 调用该instantiateItem()方法时,判断一下要生成的 Fragment 是否已经生成过了,如果生成过了,就使用旧的,旧的将被 Fragment.attach();

  • 如果没有,就调用 getItem() 生成一个新的,新的对象将被 FragmentTransation.add()。 FragmentStatePagerAdapter会将所有生成的 Fragment 对象通过 FragmentManager 保存起来备用,以后需要该 Fragment 时,都会从 FragmentManager 读取,而不会再次调用 getItem() 方法。

2. Fragment数据的缓存

  • Fragment在初始化View对象,把该对象作为一个成员变量进行保存。 再一次初始化Fragment对应的View对象时,判断当前成员变量View对象是否为空。 如果为空,创建新的View对象,否则,不在创建。这样就可以做到对Fragemnt进行数据缓存

  • 这样做的好处:避免了每次加载Fragment都要重新创建View,加载数据了。提高了性能,以及减少了内存的开销。

3. ViewPager预加载

  • 我们知道,系统的ViewPager默认提供预加载机制。但是,根据业务需要,取消掉对应的预加载机制。 可以这样做:

  • 替换掉系统原生的Viewpager类。将该类中的一个变量mOffscreenPageLimit 设置为0,不进行预加载

4. Fragment嵌套Fragment

  • 在Fragment中嵌套Fragment时,一定要使用getChildFragmentManager();
  • 否则,会在ViewPager中出现fragment不会加载的情况,即fragment出现空白页的情况。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容