美文网首页Android面试Android iOS开发知识库Android Tips
Fragment与Fragment相互切换之间的生命周期方法

Fragment与Fragment相互切换之间的生命周期方法

作者: 吾乃韩小呆 | 来源:发表于2018-05-16 22:16 被阅读267次

    最近一段时间忙于找工作,找到工作之后忙于项目上线,好久没有写过博客,现在感觉终于闲暇了,写一写这次项目中需要总结提炼的知识点,给自己留个印象吧,毕竟好记性不如烂笔头。

    首先,写一写关于Fragment生命周期的相关。先放上一张老图!!

    Fragment生命周期

    Fragment 1 切换到 Fragment 2时生命周期变化

    1、通过 add hide show 方式来切换 Fragment

    • Fragment1 的生命周期变化为:onCreate()、onCreateView、onStart()、onResume() 回调 onHiddenChanged() 方法

    • Fragment2 的生命周期变化为: onCreate()、onCreateView、onStart()、onResume()

    • Fragment 2 再次返回到 Fragment 1:不走任何生命周期方法但是回调 onHiddenChanged()方法

    总结:当以这种方式进行 Fragment 1 与 Fragment 2 的切换时,Fragment 隐藏的时候并不走 onDestroyView,所有的显示也不会走 onCreateView 方法,所有的 view 都会保存在内存

    2、使用 replace 的方法进行切换时

    • 载入Fragment 1时:

    Fragment 1的生命周期:onCreate()、onCreateView()、onStart()、onResume()

    • 切换到Fragment2时:

    Fragment 1的生命周期:onPause()、onStop()、onDestroyView()、onDestroy()

    Fragment 2的生命周期:onCreate()、onCreateV()、onStart()、onResume()

    • Fragment 2切换回Fragment 1时:

    Fragment2的生命周期:onPause()、onStop()、onDestroyView()、onDestroy()

    Fragment 1的生命周期:onCreate()、onCreateV()、onStart()、onResume()

    总结:通过 replace 方法进行替换的时,Fragment 都是进行了销毁,重建的过程,相当于走了一整套的生命周期

    3、使用 ViewPager 进行切换时

    当使用 ViewPager 与 Fragment 进行切换时,Fragment 会进行预加载操作

    所有的 Fragment 都会提前初始--->预加载;

    初始化时 Fragment 们的生命周期:

    Fragment 1 的生命周期:onCreate()、onCreateView()
    Fragment 2 的生命周期:onCreate()、 onCreateView()

    Fragment 1 切换到 Fragment 2 的生命周期:

    Fragment 1 :不走任何生命周期;
    Fragment 2 :走 setUserVisVleHint()方法

    切回去也是一样的

    注意: setUserVisVleHint()方法在 Fragment 1 第一次加载的时候不走,只有在切换的时候 走该方法

    /**
    *第一个 Fragment 需要处理  setUserVisVleHint()方法,设置为 setUserVisibleHint(true);
    *否则会产空指针异常,因为 setUserVisVleHint()方法的优先级高于 onCreate()方法。
    *
    * @param savedInstanceState
    */
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        setUserVisibleHint(true);
        super.onActivityCreated(savedInstanceState);
    }
    
    主动调用 setUserVisibleHint()方法来控制第一次不会调用setUserVisibleHint方法的问题。
    setUserVisibleHint()方法优先onCreateView方法,当onCreateView方法调用后还会再次调用setUserVisibleHint方法。
    此时要对是否调用了onCreateView()方法进行标记判断。
    
    

    具体加载数据的代码

    
    /**
     * 标志位,标志已经初始化完成
     */
    private boolean isPrepared;
    
    
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // 配置setUserVisibleHint()方法
        setUserVisibleHint(true);
        super.onActivityCreated(savedInstanceState);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_a, container, false);
    
        //已经初始化
        isPrepared = true;
        return view;
    }
    
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
    
        //可见的并且是初始化之后才加载
        if (isPrepared && isVisibleToUser) {
    
             getList();
    
        }
    }
    
    

    Activity 切换到 Fragment 的生命周期变化

    Fragment 的生命周期变化为:onStart()、onResume()

    从 Fragment 1 进行锁屏操作

    Fragment 的生命周期方法:onPause()、onSaveInstanceState()、onStop()。

    从解锁 到 Fragment 1 的生命周期

    onStart()、 onResume()

    相关文章

      网友评论

      本文标题:Fragment与Fragment相互切换之间的生命周期方法

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