Android高频面试专题 - 基础篇(二)Fragment
点击上方 **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文件中使用标签
-
在代码中,通过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懒加载
更多进阶资源,请关注下方二维码,或直接微信搜索“Android扫地僧”