Android面试(二):Fragment面试你所需知道的一切

作者: zhang_pan | 来源:发表于2017-12-01 14:29 被阅读294次

    1. 什么是Fragment:

    Fragment,俗称碎片,自Android 3.0开始被引进并大量使用。作为Activity界面的一部分,Fragment的存在必须依附于Activity,并且与Activity一样,拥有自己的生命周期,同时处理用户的交互动作。同一个Activity可以有一个或多个Fragment作为界面内容,并且可以动态添加、删除Fragment,灵活控制UI内容,也可以用来解决部分屏幕适配问题。

    2. Fragment为什么被称为第五大组件:

    首先Fragment的使用次数是不输于其他四大组件的,而且Fragment有自己的生命周期,比Activity更加节省内存。

    3. Fragment生命周期:

    1.png

    从上图可以看到Fragment比Activity多了几个额外的生命周期回调方法:

    2.png

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

    1. Activity向Fragment传值:

    步骤:

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

    2. Fragment向Activity传值:

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

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

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

    第一种:
    通过findFragmentByTag得到另一个的Fragment的对象,这样就可以调用另一个的方法了。
    第二种:
    通过接口回调的方式。
    第三种:
    通过setArgumentsgetArguments的方式。

    6. FragmentTransaction的add和replace的区别:

    1. add + hide + show的方式:
      其实add是一层层添加上去的,通过show去显示当前界面,hide去隐藏其他的界面,这时候的FrameLayout是会有很多层的。Fragment A 切换到Fragment B,然后再由Fragment B 切换到Fragment A 的时候,Fragment A 的所有生命周期是不会走的,只会调用onHiddenChanged(boolean isHidden),也就是说hide和show只是把其他界面隐藏,当前界面显示的效果,并不会走生命周期方法。

    2. replace的方式:
      其实replace是会替换掉原有的,所以这种方式的FrameLayout是只有一层的,再如上面的方式切换fragment,Fragment A会依次走生命周期方法:onAttach ---> onViewCreated ---> onActivityCreated ---> onStart。但是如果添加代码 ft.addToBackStack(null),生命周期方法onAttach方法就不会走。

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

    Fragment的事物管理器内部维持了一个双向链表结构,该结构可以记录我们add或者replace的Fragment,然后当我们按返回键的时候,会自动帮我们实现出栈操作。

    8. FragmentPagerAdapter与FragmentStatePagerAdapter的区别:

    一. 由于FragmentStatePagerAdapter在destoryItem的时候调用mCurTransaction.remove(fragment),会回收内存的,而页面比较多的时候,就比较消耗内存,所以FragmentStatePagerAdapter适合于页面比较多的情况。
    二. FragmentPagerAdapter在destoryItem的时候调用mCurTransaction.detach(fragment),没有回收内存,只是将fragment与activity的UI进行分离,所以FragmentPagerAdapter适合于页面比较少的情况。

    总结:FragmentPagerAdapter适用于页面较少的情况,FragmentStatePagerAdapter适用于页面较多的情况。

    喜欢本篇博客的简友们,就请来一波点赞,您的每一次关注,将成为我前进的动力,谢谢!

    相关文章

      网友评论

        本文标题:Android面试(二):Fragment面试你所需知道的一切

        本文链接:https://www.haomeiwen.com/subject/wfbibxtx.html