Android基础(2)Fragment详解

2019-02-19  本文已影响0人  perry_Fan

(1)fragment各种情况下的生命周期
(2)Fragment状态保存 startActivityForResult是哪个类的方法,在什么情况下使用?
(3)如何实现Fragment的滑动?
(4)fragment之间传递数据的方式?
(5)Activity与Fragment通信的方式?
(6)ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?
(7)Fragment 如果在Adapter中使用 应该如何解耦?
(8)微信上消息小红点的原理 (观察者模式)

一. Fragment在各种情况下的生命周期
1)相比于Activity的生命周期多了如下几个方法

onAttach():当Fragment与Activity发生关联时,该方法被调用
onCreateView():创建Fragment的视图
onActivityCreate():当Activity的onCreate()返回时被调用
onDestroyView():与onCreateView()是对应的,当Fragment的视图被销毁时,该方法被调用
onDetach(): 与onAttach() 方法相对应,当Fragment与Activity的关联被取消时,该方法被调用

2)Activity中调用 replace() 方法时的生命周期

新替换的Fragment:onAttach--> onCreate -->onCreateView --> onViewCreated --> onActivityCreated --> onStart --> onResume
被替换的Fragment: onPause --> onStop --> onDestroyView --> onDestroy --> onDetach

3) Activity中调用replace()方法和addToBackStack()方法时的生命周期

新替换的Fragment(没有在BackStack中):
onAttach > onCreate > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

新替换的Fragment(已经在BackStack中):
onCreateView > onViewCreated > onActivityCreated > onStart > onResume

被替换的Fragment:onPause > onStop > onDestroyView

4)Fragment在运行状态后跟随Activity的生命周期

Fragment在上述的各种情况下进入了onResume后,则进入了运行状态,以下4个生命周期方法将跟随所属的Activity一起被调用:
onPause > onStop > onStart > onResume

5)常见场景
二. Fragment状态保存 startActivityForResult是哪个类的方法,在什么情况下使用?

Fragment调用startActivityForResult --->
HostCallbacks . onStartActivityFromFragment --->
FragmentActivity.startActivityFromFragment

Fragment 和 Activity 都有startActivityForResult方法,切记不要调用错误。如果发现Fragment 的onActivityResult拿不到数据,而FragmentActivity拿到了数据,并且requestCode与Fragment中用到的requestCode不一致,那么一定是在Fragment中调用了FragmentActivity的startActivityForResult方法。

源码可以看出requestCode不一致的原因了,使用Fragment发起的请求,因为一个Activity可以包含多个Fragment,而且都可以发起请求,那么会使用一个容器来保存发起请求的Fragment和它对应的requestCode,mPendingFragmentActivityResults就是这个容器,发起请求的时候将在容器中的index和requestCode算在一起,作为最终的requestCode。

FragmentActivity 和 它的内部类 HostCallbacks 分别展现了两个startActivityForResult方法的调用。FragmentActivity本身是有startActivityForResult方法,依附它的Fragment也有startActivityForResult方法,那么放在HostCallbacks里,这就体现了HostCallbacks是一座桥梁,链接了Fragment和FragmentActivity之间的通信。

三. 如何实现Fragment的滑动?

可以结合Viewpager。

四. fragment之间传递数据的方式?
  1. 直接在一个Fragment中调用另外一个Fragment中的方法
  2. 使用回调接口
  3. 使用广播
  4. Fragment直接调用Activity中的public方法
  5. EventBus、RxBus
  6. Bundle和setArguments(bundle)
五. Activity与Fragment通信的方式?

1)Handler
2)广播
3)EventBus
4)接口回调
5)Bundle和setArguments(bundle)

六. ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?

设置懒加载。通过setUserVisibleHint方法判断可见性。
其中 FragmentStatePagerAdapter 适合大量页面,不断重建和销毁。
FragmentPagerAdapter 适合少量页面,常驻内存。
详见差异描述:https://segmentfault.com/a/1190000012455727

七. Fragment 如果在Adapter中使用 应该如何解耦?
上一篇下一篇

猜你喜欢

热点阅读