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。
- DialogFragment
- 生命周期
- 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);
}
}
- publicstaticclassExampleFragmentextendsFragment{
- 参数:
-
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控件对象。
- 为fragment提供layout,你必须实现onCreateView()回调方法,然后在这个方法中返回一个View对象,这个对象是fragment的layout的根。
- 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()。
-
- 方法一:在activity的layoutxml文件中声明fragment
- 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()。
-
-
- 事务是什么
- 在activity中调用方法getFragmentManager()
- 要管理fragment们,需使用FragmentManager
- 1.创建Fragment