zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    LeetCode OJ 107. Binary Tree Level Order Traversal II
    LeetCode OJ 116. Populating Next Right Pointers in Each Node
    LeetCode OJ 108. Convert Sorted Array to Binary Search Tree
    LeetCode OJ 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode OJ 98. Validate Binary Search Tree
    老程序员解Bug的通用套路
    转载 四年努力,梦归阿里,和大家聊聊成长感悟
    转载面试感悟----一名3年工作经验的程序员应该具备的技能
    Web Service和Servlet的区别
    关于spring xml文件中的xmlns,xsi:schemaLocation
  • 原文地址:https://www.cnblogs.com/YFEYI/p/10709287.html
Copyright © 2011-2022 走看看