Android学习笔记之fragment

fragment:

  • (一)、fragment是什么?
    • 是activity的界面中的一部分或一种行为。
    • 你可以把Fragment认为模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity运行时被添加或删除。
    • 你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment。
  • (二)、有什么用?
    • Android从3.0开始引入fragment,主要是为了支持更动态更灵活的界面设计
    • 通过把activity的layout分成fragment,你可以在activity运行时改变它的样子,并且可以在activity的后退栈中保存这些改变。
    • 应用场景
      • 写一个读新闻的程序
        • 需求
          • 新闻标题和内容简介
          • 新闻内容
        • 一般界面设计
        • 通过fragment实现
  • (三)、Fragment怎么用
    • 1.创建Fragment
      • 生命周期
          • + -生命周期场景演示
            • 场景演示 : 切换到该Fragment

              11-29 14:26:35.095: D/AppListFragment(7649): onAttach
              11-29 14:26:35.095: D/AppListFragment(7649): onCreate
              11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
              11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
              11-29 14:26:35.120: D/AppListFragment(7649): onStart
              11-29 14:26:35.120: D/AppListFragment(7649): onResume

              屏幕灭掉:

              11-29 14:27:35.185: D/AppListFragment(7649): onPause
              11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
              11-29 14:27:35.205: D/AppListFragment(7649): onStop


              屏幕解锁

              11-29 14:33:13.240: D/AppListFragment(7649): onStart
              11-29 14:33:13.275: D/AppListFragment(7649): onResume


              切换到其他Fragment:
              11-29 14:33:33.655: D/AppListFragment(7649): onPause
              11-29 14:33:33.655: D/AppListFragment(7649): onStop
              11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView


              切换回本身的Fragment:

              11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
              11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
              11-29 14:33:55.825: D/AppListFragment(7649): onStart
              11-29 14:33:55.825: D/AppListFragment(7649): onResume

              回到桌面

              11-29 14:34:26.590: D/AppListFragment(7649): onPause
              11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
              11-29 14:34:26.880: D/AppListFragment(7649): onStop

              回到应用

              11-29 14:36:51.940: D/AppListFragment(7649): onStart
              11-29 14:36:51.940: D/AppListFragment(7649): onResume


              退出应用

              11-29 14:37:03.020: D/AppListFragment(7649): onPause
              11-29 14:37:03.155: D/AppListFragment(7649): onStop
              11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
              11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
              11-29 14:37:03.165: D/AppListFragment(7649): onDetach

          • 生命周期方法被调用契机
            • 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()  //初始化UI
              onActivityCreated()   //具体操作
                   6.fragments的大部分状态都和activitie很相似,但fragment有一些新的状态。


              onAttached() —— 当fragment和activity关联之后,调用这个方法。
              onCreateView() —— 创建fragment中的视图的时候,调用这个方法。
              onActivityCreated() —— 当activity的onCreate()方法被返回之后,调用这个方法。
              onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
              onDetach() —— 当fragment和activity分离的时候,调用这个方法。

      • 新建一个类继承Fragment或者Fragment的派生类
        • DialogFragment
          • 显示一个浮动的对话框。使用这个类创建对话框是替代activity创建对话框的最佳选择.因为你可以把fragmentdialog放入到activity的返回栈中,使用户能再返回到这个对话框。
        • ListFragment
          • 显示一个列表控件,就像ListActivity类,它提供了很多管理列表的方法,比如onListItemClick()方法响应click事件。
        • PreferenceFragment
          • 显示一个由Preference对象组成的列表,与PreferenceActivity相同。它用于为程序创建“设置”activity。
    • 2.fragment添加用户界面
      • 为fragment提供layout,你必须实现onCreateView()回调方法,然后在这个方法中返回一个View对象,这个对象是fragment的layout的根。
        • 例子
          • publicstaticclassExampleFragmentextendsFragment{   
                @Override
                publicViewonCreateView(LayoutInflater inflater,
                    ViewGroupcontainer,BundlesavedInstanceState){        //Inflate the layout for this fragment       
                    returninflater.inflate(R.layout.example_fragment,container,false);    
                }
            }
        • 参数:
          • container是存放fragment的layout的ViewGroup对象

            savedInstanceState参数是一个Bundle,跟activity的onCreate()中Bundle差不多,用于状态恢复但是fragment的onCreate()中也有Bundle参数,所以此处的Bundle中存放的数据与onCreate()中存放的数据还是不同的

            Inflate()方法有三个参数

            • layout的资源ID。

              存放fragment的layout的ViewGroup。

              布尔型数据表示是否在创建fragment的layout期间,把layout附加到container上(在这个例子中,因为系统已经把layout插入到container中了,所以值为false,如果为true会导至在最终的layout中创建多余的ViewGroup

      • 注:如果你的fragment是从ListFragment中派生的,就不需要实现onCreateView()方法了,因为默认的实现已经为你返回了ListView控件对象。
    • 3.把fragment添加到activity
      • 方法一:在activity的layoutxml文件中声明fragment
        • <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal"   
          android:layout_width="match_parent"   
          android:layout_height="match_parent">
                  <fragmentandroid:name="com.example.news.ArticleListFragment"           
                            android:id="@+id/list"            android:layout_weight="1"            android:layout_width="0dp"                                 android:layout_height="match_parent"/>
                  <fragmentandroid:name="com.example.news.ArticleReaderFragment"
                             android:id="@+id/viewer"            android:layout_weight="2"            android:layout_width="0dp"                          android:layout_height="match_parent"/>
          </LinearLayout>

          当系统创建上例中的layout时,它实例化每一个fragment,然后调用它们的onCreateView()方法,以获取每个fragment的layout。系统把fragment返回的view对象插入到<fragment>元素的位置,直接代替<fragment>元素。

          + -  注:每个fragment都需要提供一个ID,系统在activity重新创建时用它来恢复fragment们,你也可以用它来操作fragment进行其它的事物,比如删除它。有三种方法给fragment提供ID:

          • 1 为android:id属性赋一个数字。
          • 2 为android:tag属性赋一个字符串。
          • 3 如果你没有使用上述任何一种方法,系统将使用fragment的容器的ID。
      • 方法二:在代码中添加fragment到一个ViewGroup
        • 这种方法可以在运行时,把fragment添加到activity的layout中。你只需指定一个要包含fragment的ViewGroup。
        • 从activity获取到FragmentTransaction
          • FragmentManager fragmentManager =getFragmentManager() FragmentTransactionfragmentTransaction =fragmentManager.beginTransaction();

            为了完成fragment的事务(比如添加,删除,替换等),你必须使用FragmentTransaction的方法。

        • 用add()方法添加一个fragment
          • ExampleFragmentfragment =newExampleFragment(); fragmentTransaction.add(R.id.fragment_container,fragment);
            fragmentTransaction.commit();

            参数:

            • 第一个参数是容器ViewGroup
            • 第二个是要添加的fragment
            • 第三个参数:tag值
            • 说明:一旦你通过FragmentTransaction对fragment做出了改变,你必须调用方法commit()提交这些改变。
            • 不仅在无界面的fragment中,在有界面的fragment中也可以使用tag来作为为一标志,这样在需要获取fragment对象时,要调用findFragmentTag()。
      • 添加一个没有界面的fragment
        • 在activity中调用方法add(Fragment,String)(它支持用一个唯一的字符串做为fragment的”tag”,而不是viewID)。这样添加的fragment由于没有界面,所以你在实现它时不需调用实现onCreateView()方法。

          使用tag字符串来标识一个fragment并不是只能用于没有界面的fragment上,你也可以把它用于有界面的fragment上,但是,如果一个fragment没有界面,tag字符串将成为它唯一的选择。获取以tag标识的fragment,需使用方法findFragmentByTab()。

    • 4.管理fragment
      • 要管理fragment们,需使用FragmentManager
        • 在activity中调用方法getFragmentManager()
          • 1使用方法findFragmentById()或findFragmentByTag(),获取activity中已存在的fragment们。
          • 2使用方法popBackStack()从activity的后退栈中弹出fragment们(这可以模拟后退键引发的动作)。
          • 3用方法addOnBackStackChangedListerner()注册一个侦听器以监视后退栈的变化。
        • 执行Fragment的事务
          • 事务是什么
            • 对fragment进行添加、删除、替换以及执行其它动作
            • 提交的一组fragment的变化叫做一个事务
          • 怎么用
            • 通过FragmentManager来取得FragmentTransaction的实例,通过FragmentTransaction来执行

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

                • 使用findFragmentById()或findFragmentByTag()方法来获取指定Fragment;
                • 调用popBackStack()方法将Fragment从回退栈中弹出(如同用户按下“返回键”的效果);
                • 调用addOnBackStackChangeListener()注册一个监听器,用于监听回退栈的变化情况。

                show

                hide

                ft.setCustomAnimations

              一个事务是在同一时刻执行的一组动作(很像数据库中的事务)。你可以用add(),remove(),replace()等方法构成事务,最后使用commit()方法提交事务。

              在调用commint()之前,你可以用addToBackStack()把事务添加到一个后退栈中,这个后退栈属于所在的activity。有了它,就可以在用户按下返回键时,返回到fragment们执行事务之前的状态。

              密技:   对于fragment事务,你可以应用动画。在commit()之前调用setTransition()就行

              提示:  

              • 调用commit()后,事务并不会马上执行。它会在activity的UI线程(其实就是主线程)中等待直到线程能执行的时候才执行(废话)。如果必要,你可以在UI线程中调用executePendingTransactions()方法来立即执行事务。但一般不需这样做,除非有其它线程在等待事务的执行。

              注意:

              • 你必须最后调用commit()。

                如果你添加了多个fragment,那么它们的显示顺序跟添加顺序一至

                如果你向事务添加了多个动作,比如多次调用了add(),remove()等之后又调用了addToBackStack()方法,那么所有的在commit()之前调用的方法都被作为一个事务。当用户按返回键时,所有的动作都被反向执行(事务回溯)。

              警告:

              • 你只能在activity处于可保存状态的状态时,比如running中,onPause()方法和onStop()方法中提交事务,否则会引发异常。这是因为fragment的状态会丢失。如果要在可能丢失状态的情况下提交事务,请使用commitAllowingStateLoss()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值