• Fragment生命周期以及使用时的小问题


    前言-

    昨天在写UI的时候用到了FRAGMENT,发现自己对此还不是非常了解,借此机会记录一下

    Fragment的生命周期-

    官方生命周期图:

    FRAGMENT生命周期

    Fragment每个生命周期方法的意义、作用-

    onViewStateRestored(Bundle):告诉片段,它的视图层次结构的所有保存状态都已恢复。

    setUserVisibleHint():设置Fragment可见或者不可见时会调用此方法。在该方法里面可以通过调用getUserVisibleHint()获得Fragment的状态是可见还是不可见的,如果可见则进行懒加载操作。onAttach():执行该方法时,Fragment与Activity已经完成绑定,该方法有一个Activity类型的参数,代表绑定的Activity,这时候你可以执行诸如mActivity = activity的操作。


    onCreate():初始化Fragment。可通过参数savedInstanceState获取之前保存的值。


    onCreateView():初始化Fragment的布局。加载布局和findViewById的操作通常在此函数内完成,但是不建议执行耗时的操作,比如读取数据库数据列表。


    onActivityCreated():执行该方法时,与Fragment绑定的Activity的onCreate方法已经执行完成并返回,在该方法内可以进行与Activity交互的UI操作,所以在该方法之前Activity的onCreate方法并未执行完成,如果提前进行交互操作,会引发空指针异常。


    onStart():执行该方法时,Fragment由不可见变为可见状态。


    onResume():执行该方法时,Fragment处于活动状态,用户可与之交互。


    onPause():执行该方法时,Fragment处于暂停状态,但依然可见,用户不能与之交互。


    onSaveInstanceState():保存当前Fragment的状态。该方法会自动保存Fragment的状态,比如EditText键入的文本,即使Fragment被回收又重新创建,一样能恢复EditText之前键入的文本。


    onStop():执行该方法时,Fragment完全不可见。


    onDestroyView():销毁与Fragment有关的视图,但未与Activity解除绑定,依然可以通过onCreateView方法重新创建视图。通常在ViewPager+Fragment的方式下会调用此方法。


    onDestroy():销毁Fragment。通常按Back键退出或者Fragment被回收时调用此方法。


    onDetach():解除与Activity的绑定。在onDestroy方法之后调用。

    Fragment生命周期执行流程-

    • Fragment创建

      setUserVisibleHint()->onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume();Fragment变为不可见状态(锁屏、回到桌面、被Activity完全覆盖):onPause()->onSaveInstanceState()->onStop();

    • Fragment变为部分可见状态(打开Dialog样式的Activity)

      onPause()->onSaveInstanceState();

    • Fragment由不可见变为活动状态

      onStart()->OnResume();

    • Fragment由部分可见变为活动状态

      onResume();

    • 退出应用

      onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()(注意退出不会调用onSaveInstanceState方法,因为是人为退出,没有必要再保存数据);

    • Fragment被回收又重新创建:

      被回收执行onPause()->onSaveInstanceState()->onStop()->onDestroyView()->onDestroy()->onDetach(),

      重新创建执行onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()->setUserVisibleHint();

    • 横竖屏切换-

      与Fragment被回收又重新创建一样。

      摘自法捷耶夫大佬的文章https://www.cnblogs.com/fajieyefu/p/6092465.html

     

    实战中遇到的一些小问题-

    Fragment中获取上下文Context对象

    getActivity();  //获取包含该fragment的活动(activity)的上下文

    通过上面的生命周期我们知道fragment在OnAttach后才会获取Activity,所以这个方法需要写在onAttach()或者在其以后生命周期方法中

    @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            context=this.getActivity();
        }

    getContext();  //获取该fragment上下文  只查看当前运行的活动的上下文。(Fragment是嵌在Activity的话,感觉这个和Activity的context是一样的)

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_liebie,container,false);
        context=view.getContext();
    }

    getApplicationContext() ;  //生命周期是整个应用,应用摧毁它才摧毁。而Activity.this的context 拿到的是当前Activity的Context,而getApplicationContext()拿到的是Application的Context。

    1.this.getActivity()

    • 优点:直接调用就能获取
    • 缺点:Fragment很容易被销毁,调用getActivity()方法会报空指针错误(注意:并不是getActivity()返回值为null,而是this.getActivity()中的this,也就是Fragment自己是null,因为它已经被销毁了)

    2.获取Application对象

    • 优点:不会遇到类似this.getActivity()的空指针问题
    • 缺点:某些情况下的Context必须是Activity,特别是实例化Dialog等需要依附于一个Activity的可视化的对象时传参必须是Activity对象(Toast是Android的一种通知机制,不需要依附于Activity

    getActivity().getApplicationContext();//通过包含该fragment的活动(activity)获取整个应用的上下文

    getContext().getApplicationContext();//通过该fragment获取整个应用的上下文Fragment中findViewById

    这四种方式效果相同

    Fragment中的findViewById

    findViewById方法却只能被用在Activity类中,但是如果想要在fragment中使用的话就需要view了

    View view = inflater.inflate(R.layout.view, container, false);
    //两种皆可
    TextView tx=view.findViewById(R.id.id_view);
    //TextView tx=getView().findViewById(R.id.id_view);
  • 相关阅读:
    目录-富爸爸穷爸爸
    目录-高效能人士的七个习惯(精华版)
    目录-卓有成效的管理者
    计算机网络自顶向下方法目录
    计算机网络_第7版_谢希仁_目录
    计算机网络各层协议
    TCP_IP详解卷一目录
    http 权威指南 目录
    Redis 知识体系
    Apache Commons 列表
  • 原文地址:https://www.cnblogs.com/YFEYI/p/10709287.html
Copyright © 2020-2023  润新知