浅谈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介绍完了。

        



                     

更多相关文章

  1. Java事件模型与Android事件模型的比较
  2. Visual Studio 跨平台開發實戰(5) - Xamarin Android(安卓)多頁
  3. 获取Android的Java源代码并在Eclipse中关联查看的最新方法
  4. 总结Content Provider的使用
  5. android入门教程(十六)之-- 使用Intent传递数据
  6. android调节音量——AudioManager的应用
  7. 很容易理解的Android消息机制分析
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android(安卓)ListView组件中android:dra
  2. xamarin android 如何创建一个服务
  3. Android(安卓)中 QQ 和 微信打开第三方应
  4. Android教程收集贴
  5. Android读写文件
  6. Android(安卓)获取闹钟引发的血案
  7. Android平移动画
  8. H3 android 系统编译
  9. Android(安卓)CTS 测试总结
  10. 近百个Android优秀开源项目,覆盖Android开