Android面试题之Fragment篇

前言

秋招在即,计蒙准备在国庆假期结束前整理一套Android初级面试题籍,希望对大家有所帮助


提示:以下是本篇文章正文内容

Fragment

1.如何切换 fragement(不重新实例化)

翻看了 Android 官方 Doc,和一些组件的源代码,发现 replace()这个方法只是在上一个 Fragment不再需要时采用的简便方法.

正确的切换方式是 add(),切换时 hide(),add()另一个 Fragment;再次切换时,只需 hide()当前,show()另一个。

这样就能做到多个 Fragment 切换不重新实例化:


2.Fragment 的的优点

(1)Fragment 可以使你能够将 activity 分离成多个可重用的组件,每个都有它自己的生命周期和UI。

(2)Fragment 可以轻松得创建动态灵活的 UI 设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。

(3)Fragment 是一个独立的模块,紧紧地与 activity 绑定在一起。可以运行中动态地移除、加入、交换等。

(4)Fragment 提供一个新的方式让你在不同的安卓设备上统一你的 UI。

(5)Fragment 解决 Activity 间的切换不流畅,轻量切换。(6)Fragment 替代 TabActivity 做导航,性能更好。

(7)Fragment 在 4.2.版本中新增嵌套 fragment 使用方法,能够生成更好的界面效果。


3.Fragment 如何实现类似 Activity 栈的压栈和出栈效果

Fragment 的事物管理器内部维持了一个双向链表结构,该结构可以记录我们每次 add 的Fragment 和 replace 的 Fragment,然后当我们点击 back 按钮的时候会自动帮我们实现退栈操作。


4.Fragment 的 replace 和 add 方法的区别

Fragment 本身并没有 replace 和 add 方法,这里的理解应该为使用 FragmentManager 的 replace和 add 两种方法切换 Fragment 时有什么不同。

我们经常使用的一个架构就是通过 RadioGroup 切换 Fragment,每个 Fragment 就是一个功能模块。

Fragment 的容器一个 FrameLayout,add 的时候是把所有的 Fragment 一层一层的叠加到了FrameLayout 上了,而 replace 的话首先将该容器中的其他 Fragment 去除掉然后将当前 Fragment添加到容器中。

一个 Fragment 容器中只能添加一个 Fragment 种类,如果多次添加则会报异常,导致程序终止,而 replace 则无所谓,随便切换。

因为通过 add 的方法添加的 Fragment,每个 Fragment 只能添加一次,因此如果要想达到切换效果需要通过 Fragment 的的 hide 和 show 方法结合者使用。将要显示的 show 出来,将其他 hide起来。这个过程 Fragment 的生命周期没有变化。通过 replace 切换 Fragment,每次都会执行上一个 Fragment 的 onDestroyView,新 Fragment的 onCreateView、onStart、onResume 方法。

基于以上不同的特点我们在使用的使用一定要结合着生命周期操作我们的视图和数据。


5.Fragment与Activity之间是如何传值的

  1. Activity向Fragment传值:

将要传的值,放到bundle对象里; 在Activity中创建该Fragment的对象fragment,
通过调用 fragment.setArguments()传递到fragment中;
在该Fragment中通过调用getArguments()得到bundle对象,就能得到里面的值。

  1. Fragment向Activity传值:

在Activity中调用getFragmentManager()得到fragmentManager,,调用findFragmentByTag(tag)或者通过findFragmentById(id)
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(tag);

通过回调的方式,定义一个接口(可以在Fragment类中定义),接口中有一个空的方法,在fragment中需要的时候调用接口的方法,值可以作为参数放在这个方法中,然后让Activity实现这个接口,必然会重写这个方法,这样值就传到了Activity中


6.Fragment生命周期

  1. onAttach(Contextcontext):在Fragment和Activity关联上的时候调用,且仅调用一次。在该回调中我们可以将context转化为Activity保存下来,从而避免后期频繁调用getAtivity()获取Activity的局面,避免了在某些情况下getAtivity()为空的异常(Activity和Fragment分离的情况下)。同时也可以在该回调中将传入的Arguments提取并解析,在这里强烈推荐通过setArguments给Fragment传参数,因为在应用被系统回收时Fragment不会保存相关属性。
  2. onCreate:在最初创建Fragment的时候会调用,和Activity的onCreate类似。
  3. View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState):在准备绘制Fragment界面时调用,返回值为Fragment要绘制布局的根视图,当然也可以返回null。注意使用inflater构建View时一定要将attachToRoot指明false,因为Fragment会自动将视图添加到container中,attachToRoot为true会重复添加报错。onCreateView并不是一定会被调用,当添加的是没有界面的Fragment就不会调用,比如调用FragmentTransaction的add(Fragment fragment, String tag)方法。
  4. onActivityCreated :在Activity的onCreated执行完时会调用。
  5. onStart() :Fragment对用户可见的时候调用,前提是Activity已经started。
  6. onResume():Fragment和用户之前可交互时会调用,前提是Activity已经resumed。
  7. onPause():Fragment和用户之前不可交互时会调用。
  8. onStop():Fragment不可见时会调用。
  9. onDestroyView():在移除Fragment相关视图层级时调用。
  10. onDestroy():最终清楚Fragment状态时会调用。
  11. onDetach():Fragment和Activity解除关联时调用。

7.ViewPager对Fragment生命周期的影响

ViewPager+Fragment是比较常见的组合了,一般搭配ViewPager的FragmentPagerAdapter或FragmentStatePagerAdapter使用。不过ViewPager为了防止滑动出现卡顿,有一个缓存机制,默认情况下ViewPager会创建并缓存当前页面左右两边的页面(如Fragment)。此时左右两个Fragment都会执行从onAttach->….->onResume的生命周期,明明Fragment没有显示却已经到onResume了,在某些情况下会出现问题。比如数据的加载时机、判断Fragment是否可见等。


关于整理问题

当全部整理完毕后将整理成pdf格式,以方便阅读,文件获取如下图(10月8日后)!


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42761395/article/details/108897377