浅谈Android中的 Fragment、生命周期回调方法 以及使用

    xiaoxiao2023-05-27  3

                                                          浅谈Android中的 Fragment 以及使用

    Fragment 是个什么东西?

                            可以把Fragment理解成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。还可以覆盖前面的一个页面,加载想要的模块

     Fragment介绍:

                          Android是在Android 3.0 (API level 11)开始引入Fragment的,要么用全部用app,要么全部用v4(3.0以下需要导入的包),不然可是会报错的!

    那么如果开发的app需要在3.0以下的版本运行呢?比如还有一点点市场份额的2.3!

    于是乎,v4包就这样应运而生了,而最低可以兼容到1.6版本!至于使用哪个包看你的需求了,不过现在几乎都是

    4.0以上的,所以这个时候,你可以直接使用app包下的Fragment,然后调用相关的方法通常都是不会有什么问题的

            使用v4包要注意的事项:

    ①如果你使用了v4包下的Fragment,那么所在的那个Activity就要继承FragmentActivity哦!

    案例:今天在xml文件中静态地载入fragment,然后重写了Fragment,但是在加载Activity的时候就报错了,

    大概的提示就是Fragment错误还是找不到什么的,name属性改了几次还是错!最后才发现是用了

    v4的包的缘故,只需让自己的Activity改成FragmentActivity即可!

    Fragment 生命周期?                                                          Activity生命周期:

                     两个生命周期对比:                  只有真正的掌握 生命周期 才能更好的运用frgment .        1.onAttach()           作用:fragment已经关联到activity,这个时候 activity已经传进来了, 获得activity的传递的值 就可以进行 与activity的通信里, 当然也可以使用getActivity(),前提是这个fragment已经和宿主的activity关联,并且没有脱离,有且只有调用一次。          2.onCreate()         系统创建fragment的时候回调他,在他里面实例化一些变量         这些个变量主要是:当你 暂停 停止的时候 你想保持的数据         他只调用一次。

            3.onCreateView()

              第一次使用的时候 fragment会在这上面画一个layout出来, 为了可以画控件 要返回一个 布局的view,也可以返回null j 就什么都没有显示。 

               当系统用到fragment的时候 fragment就要返回他的view,越快越好 ,所以尽量在这里不要做耗时操作,比如从数据库加载大量数据

            4onActivityCreated()

                 当Activity中的onCreate方法执行完后调用。

           注意了: 从这句官方的话可以看出:当执行onActivityCreated()的时候 activity的onCreate才刚完成。 所以在onActivityCreated()调用之前 activity的onCreate可能还没有完成, 所以不能再onCreateView()中进行 与activity有交互的UI操作,UI交互操作可以在onActivityCreated()里面进行。 所以呢,这个方法主要是初始化那些你需要你的父Activity或者Fragment的UI已经被完 整初始化才能初始化的元素

           5.onStart()

           和activity一致,启动Fragement 启动时回调,,此时Fragement可见。        6.onResume()

            和activity一致 在activity中运行是可见的。激活, Fragement 进入前台, 可获取焦点时激活。

           7.onPause()

            和activity一致 其他的activity获得焦点,这个仍然可见第一次调用的时候,指的是 用户 离开这个fragment(并不是被销毁) 通常用于 用户的提交(可能用户离开后不会回来了)         8.onStop()

           和activity一致, fragment不可见的, 可能情况:activity被stopped了或者 fragment被移除但被,加入到回退栈中,一个stopped的fragment仍然是活着的如果长时间不用也会被移除。

           9.   onDestroyView() 

          Fragment中的布局被移除时调用。表示fragemnt销毁相关联的UI布局, 清除所有跟视图相关的资源。

    然后这个知识移除视图  并没有销毁而且还没有脱离activity

           10.onDestroy()

           销毁fragment对象, 跟activity类似了。       11.onDetach()

           Fragment和Activity解除关联的时候调用。 脱离activity。

         

              接下来 来模拟一个fragment 的启动 按下home键 销毁等 系统是怎么样调用生命周期,这里用Logcat日志来查看

             (XX_Fragment 为Fragment的生命周期  否则为Activity周期)

          

          

            

          

          当现实fragment的时候都先执行activity方法,当销毁的时候都是现执行 fragment的方法,这样更好理解fragment是嵌套在activity中

              总结生命周期的回调方法:

               1.当一个fragment被创建的时候,它会经历以下状态.。                   onAttach()                   onCreate()                   onCreateView()                   onActivityCreated()          2.当这个fragment对用户可见的时候,它会经历以下状态。                   onStart()                   onResume()          3.当这个fragment进入“后台模式”的时候,它会经历以下状态。                   onPause()                   onStop()          4.当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。                   onPause()                   onStop()                   onDestroyView()                   onDetach()           5.就像activitie一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。                   onCreate()                   onCreateView()                   onActivityCreated()          6.fragments的大部分状态都和activitie很相似,但fragment有一些新的状态。                   onAttached() —— 当fragment和activity关联之后,调用这个方法。                   onCreateView() —— 创建fragment中的视图的时候,调用这个方法。                   onActivityCreated() —— 当activity的onCreate()方法被返回之后,调用这个方法。                   onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。                   onDetach() —— 当fragment和activity分离的时候,调用这个方法。

       解析完了生命周期 以及生命周期的回调方法,接下来看下如何应用。

     

       

          假设这次有个 侧滑菜单 就是类似QQ 的侧滑菜单   侧滑菜单上的每个item 点击之后都有自己的fragment 但是在使用过程中,如果使用不当,很容易造成 不断的重新加载view 损耗内存空间。

            这几天在网上查找了一些frgment 的优化资料,也发现了很多都是问题,自己撸一套自己使用。

         

      介绍具体的几个常用的方法:

          

    FragmentManager fragmentManager = getFragmentManager() FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

     

           管理Fragment的一些添加 隐藏 替换等操作 需要的。

       (注:如果import android.support.v4.app.FragmentManager;那么使用的是:FragmentManager fragmentManager = getSupportFragmentManager())

           add()方法加上Fragment的对象

      

    fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit();       一次类推。   replace()   show()  hide()  等方法都是类似使用。

             这里最后看一贴代码,最后的使用

           

    public void switchConent(Fragment from, Fragment to, String title) { FragmentTransaction transactio = getSupportFragmentManager().beginTransaction(); // 如果没有加入过 if (!to.isAdded()) { if (from != null) { // 如果不为空 则隐藏 transactio.hide(from); transactio.addToBackStack(null); } // 添加 transactio.add(R.id.content_frame, to); transactio.commit(); } else { if (from != null) { transactio.hide(from); } /**这里可以写一些用户操作数据的 调用方法*/ // 隐藏当前的fragment,显示下一 transactio.show(to).commit(); } }

                        from 从哪个fragment 换到 目标fragment to;

                       isadded() 判断事都 添加过 如果没有 那可以添加。

                       逻辑也很简单,隐藏 显示 提交 交互使用。

     

                        比较关键的一点 就是如何更新fragment上的UI数据。 这里可以在对应的fragment 里写一些UI操作的方法 然后在 上面那段代码 show(Object).commit()   中调用。

      

                          管理 侧滑菜单上的所有  Fragment:

                          可以用 单例模式和工厂模式 来管理 全部的fragment 防止多次被创建。引用当前显示的fragment作为等下 换页的时候

          传入参数的from。

                        简单的fragment介绍完了。

            

                         

    转载请注明原文地址: https://ju.6miu.com/read-1260764.html
    最新回复(0)