美文网首页简述
简述Android Fragment

简述Android Fragment

作者: 萌码象C | 来源:发表于2017-12-14 17:17 被阅读0次

    目录:
    [TOC]

    Fragment的生命周期

    • onAttach()
      当Fragment与Activity发生关联时调用。

    • onCreate()
      当创建Fragment实例时,系统回调的方法。在该方法中,需要对一些必要的组件进行初始化,以保证这个组件的实例在Fragment处于pause或stop状态时仍然存在。

    • onCreateView()
      当第一次在Fragment上绘制UI时,系统回调的方法。该方法返回一个View对象,该对象表示Fragment的根视图;若Fragment不需要展示视图,则该方法可以返回null。

    • onActivityCreated()
      当Activity的onCreate()返回时调用。

    • onStart()

    • onResume()

    • onPause()
      当用户离开Fragment时回调的方法(并不意味着该Fragment被销毁)。在该方法中,可以对Fragment的数据信息做一些持久化的保存工作,因为用户可能不再返回这个Fragment。

    • onShop()

    • onDestoryView()
      与onCreateView想对应,当该Fragment的视图被移除时调用。

    • onDestory()
      当Fragment销毁时调用。

    • onDetach()
      与onAttach相对应,当Fragment与Activity关联被取消时调用。

    注意:除了onCreateView(),其他的所有方法如果你重写了,必须调用父类对于该方法的实现。

    将Fragment加入Activity的两种方式

    • 静态使用
      使用fragment标签,将Fragment当成普通的控件,直接写在Activity的布局文件中,用布局文件调用Fragment。

      1. 继承Fragment,重写onCreateView设置Fragemnt的布局文件;
      2. 在Activity的布局文件中,使用标签<fragment name=""/>,属性android:name指定Fragment的全限定类名;
      3. 在Activity中声明此Fragment,就当和普通的View一样。
    • 动态使用

      1. 继承Fragment,重写onCreateView设置Fragemnt的布局文件;
      2. 在Activity的布局文件中,使用标签 <FrameLayout/>;
      3. 在Activity中实例化此Fragment;
      4. 获取FragmentManager对象,并通过FragmentManager对象获取FragmentTransaction对象;
      5. 通过FragmentTransaction对象的方法将实例化Fragment,添加到在Activity的布局文件的标签<FrameLayout/>容器中。

    FragmentManager

    主要用于在Activity中操作Fragment。

    • 获取方式

      • Android 3.0以上版本:getFragmentManager()
      • Android 3.0以下版本:getSupportFragmentManager()
      • 注意:
        使用Android3.0以下的版本,需要引入v4的包,然后Activity继承FragmentActivity,然后通过getSupportFragmentManager获得FragmentManager。
      • 建议:
        将Menifest文件的uses-sdk的minSdkVersion和targetSdkVersion都改为11以上,这样就不必引入v4包了。**
    • fragmentManager.beginTransaction()

      • add()
        往Activity中添加一个Fragment。

      • remove()
        从Activity中移除一个Fragment,remove会销毁整个Fragment实例。

      • replace()
        使用另一个Fragment替换当前的,实际上就是先执行remove()然后执行add()。

      • hide()
        隐藏当前的Fragment,仅设为不可见,并不会销毁。

      • show()
        显示之前隐藏的Fragment。

      • detach()
        会将View从UI中移除,和remove()不同,此时Fragment的状态依然由FragmentManager维护。

      • attach()
        重建View视图,附加到UI上并显示。只是销毁其视图结构,实例并不会被销毁。

      • commit()
        一定要在Activity.onSaveInstance()之前调用。

      • 注意:
        当使用add(),show(),hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调onStop()等生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged(),这点要切记。

    Fragment回退栈

    • 入栈
      FragmentTransaction.addToBackStack(String)

    • 栈顶出栈
      getFragmentManager().popBackStack()

    • 获取栈内数目
      getFragmentManager().getBackStackEntryCount()

    • 场景1:
      Fragment_A add() 启动 Fragment_B add()
      Fragment_A replce() 启动 Fragment_B add()

      • Fragment_A:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
      • Fragment_B:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
      • Back键: 退出应用
        • Fragment_A: onPause()
          Fragment_B: onPause()
          Fragment_A: onStop()
          Fragment_B: onStop()
          Fragment_A: onDestoryView() onDestory() onDetach()
          Fragment_B: onDestoryView() onDestory() onDetach()
    • 场景2:
      Fragment_A add() 启动 Fragment_B replce()
      Fragment_A replce() 启动 Fragment_B replce()

      • Fragment_A:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume() onPause() onStop() onDestoryView() onDestory() onDetach()
      • Fragment_B:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
      • Back键: 退出应用
        • Fragment_B: onPause() onStop() onDestoryView() onDestory() onDetach()
    • 场景3:Fragment_A add() 启动 Fragment_B replce() addToBackStack()

      • Fragment_A: onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume() onPause() onStop() onDestoryView()
      • Fragment_B: onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
      • Back键: 回退到Fragment_A
        • Fragment_B: onPause() onStop() onDestoryView() onDestory() onDetach()
          Fragment_A: onCreateView() onActivityCreate() onStart() onResume()
    • 场景4:Fragment_A add() addToBackStack() 启动 Fragment_B add()

      • Fragment_A:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
      • Fragment_B:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
      • Back键:
        • 第一次:回退到Fragment_A
          • Fragment_A:
            onPause() onStop() onDestoryView() onDestory() onDetach()
        • 第二次:退出应用
          • Fragment_B:
            onPause() onStop() onDestoryView() onDestory() onDetach()
    • 场景5:Fragment_A add() addToBackStack() 启动 Fragment_B replce()

      • Fragment_A:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume() onPause() onStop() onDestoryView()
      • Fragment_B:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
      • Back键:
        • 第一次:销毁Fragment_A
          • Fragment_A:
            onDestory() onDetach()
        • 第二次:退出应用
          • Fragment_B
            onPause() onStop() onDestoryView() onDestory() onDetach()
    • 场景6:Fragment_A add() addToBackStack() 启动 Fragment_B add() addToBackStack()

      • Fragment_A:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
      • Fragment_B:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart()
      • Back键:
        • 第一次:销毁Fragment_B
          • Fragment_B:
            onPause() onStop() onDestoryView() onDestory() onDetach()
        • 第二次:销毁Fragment_A
          • Fragment_A:
            onPause() onStop() onDestoryView() onDestory() onDetach()
        • 第三次:退出应用
    • 场景7:Fragment_A replce() addToBackStack() 启动 Fragment_B replce()

      • Fragment_A:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume() onPause() onStop() onDestoryView()
      • Fragment_B:
        onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
      • Back键:
        • 第一次:销毁Fragment_A
          • Fragment_A:
            onDestory() onDetach()
        • 第二次:销毁Fragment_B并退出应用
          • Fragment_B:
            onPause() onStop() onDestoryView() onDestory() onDetach()

    Fragment通信

    • Fragment获取Activity的数据

      • getActivity()
        在Fragment中可以通过getActivity()得到当前绑定的Activity的实例,然后进行操作。
        注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。

      • newInstance()
        使用newInstance(参数)创建Fragment对象,优点是调用者只需要关系传递的哪些数据,而无需关心传递数据的Key是什么。

      • setArguments()
        创建Fragment对象,使用setArguments()方法存入数据,在onCreateView()中通过getArguments()取出数据。

    • Activity获取Fragment的数据

      • public方法
        如果Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法。

      • TAG或者ID
        如果Activity中未保存任何Fragment的引用,但每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。

    • Fragment和Fragment

      • 同宿主
        setTargetFragment()

        • 使用场景:
          当前A_Fragment启动B_Fragment,B_Fragment在完成操作后返回数据的。
        • 执行流程:
          A_Fragment使用setTargetFragment()方式启动B_Fragment,完成操作,B_Fragment通过 getTargetFragment().onActivityResult(),调用A_Fragment的onActivityResult()获取返回值。
      • 不同宿主
        startActivityForResult()

        • 使用场景:
          存在于不同Activity中的Fragment,A_Fragment点击跳转到B_Fragment中,B_Fragment操作结束并且希望它将结果返回,在A_Fragment显示。
          在Fragment中存在startActivityForResult()以及onActivityResult(),没有setResult(),用于设置返回的intent,需要通过调用getActivity().setResult()。
          Fragment能够从Activity中接收返回结果,但是自身无法返回结果,只有Activity拥有返回结果。
        • 执行流程:
          首先,A_Fragment的startActivityForResult()跳转到B_Fragment;
          其次,B_Fragment中获取A_Fragment传递的参数,执行一些操作;
          然后,B_Fragment调用getActivity().setResult(),进行设置返回的数据;
          最后,在A_Fragment的onActivityResult()拿到返回结果进行回显。

    FragmentActivity和Activity的区别

    Fragment是Android 3.0以后推出的,为了在低版本中使用Fragment就需要用到android-support-v4.jar兼容包,而FragmentActivity就是这个兼容包里面的,它提供了操作Fragment的一些方法,其功能跟Android 3.0及以后的版本的Activity的功能一样。

    Fragment设置唯一标识的方式

    1. 通过android:id属性为fragment指定唯一ID;
    2. 通过android:tag属性为fragment指定唯一字符串标识;
    3. 若上述两种凡是均未指定,则该fragment的标识为其父容器控件的ID。

    FragmentPagerAdapter与FragmentStatePagerAdapter

    • FragmentPagerAdapter
      对于不再需要的Fragment,选择调用detach方法,仅销毁视图,并不会销毁Fragment实例。
    • FragmentStatePagerAdapter
      销毁不再需要的Fragment,当当前事务提交以后,会彻底的将Fragment从当前Activity的FragmentManager中移除,state标明,销毁时,会将其onSaveInstanceState()中的bundle信息保存下来,当用户切换回来,可以通过该bundle恢复生成新的Fragment,可以在onSaveInstanceState(Bundle outState)方法中保存一些数据,在onCreate中进行恢复创建。

    相关文章

      网友评论

        本文标题:简述Android Fragment

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