在一个Activity中, Fragment代表UI的一个部分或者一个行为。一个Activity可以结合多个Fragment对象,也可以在多个activity中使用相同Fragment字节码对应的不同对象。一个Fragment对象必须被嵌入在一个主Activity对象中,该Fragment的生命周期与主Activity息息相关。比如,当主Activity处于paused状态,其对应的所有Fragment对象均处于paused状态,只有当主Activity处于resumed状态时,Fragment才能处于自由控制状态。
为该Fragment展现一个布局,必须去实现onCreateView()回掉方法。 注意:当该Fragment继承了ListFragment时,不需要覆写onCreateView()方法,因为默认返回一个ListView对象
[java] view plain copy public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.list, null); return view; }Android:name属性应该为Fragment对应类的完整路径。
[html] view plain copy <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <fragment android:id="@+id/list" android:name="com.example.news.ArticleListFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <fragment android:id="@+id/viewer" android:name="com.example.news.ArticleReaderFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" /> </LinearLayout>当Activity运行时,可以自由的在该activity上添加fragment对象,但应该指定一个ViewGroup容器,可以FragmentTransaction完成fragment的添加移除或者替换。
[java] view plain copy manager = getFragmentManager(); if(manager.findFragmentByTag("right") == null){ manager.beginTransaction().replace(R.id.right, new RightFrag(), "right").commit(); }每个fragment需要定义一个唯一的标识符,如果activity被销毁又重新启动,系统能够恢复该fragment的状态。如果想重新恢复,需满足下面有3种方式之一:
在布局文件中,定义android:id属性
[html] view plain copy <fragment android:id="@+id/list" android:name="com.example.news.ArticleListFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" />android:tag 指明 或者 一个fragment对象add()或者replace()时指定tag
[html] view plain copy <fragment android:id="@+id/list" android:tag="first" android:name="com.example.news.ArticleListFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" />或者
[java] view plain copy manager.beginTransaction() .replace(R.id.right, new RightFrag(), "right")//在事务中指明该fragment的tag .commit();如果该fragment均没有id和tag,系统将使用container view布局的id
通过getFragmentManager()方法,可以得到FragmentManager对象,主要完成下面的功能
[java] view plain copy FragmentManager manager = getFragmentManager();如果该fragment在布局文件中指定了id,通过findFragmentById()得到对象,或者指定了tag可以通过findFragmentByTag()得到对象
[java] view plain copy Fragment fragment = getFragmentManager().findFragmentByTag("right"); //or Fragment fragment = getFragmentManager().findFragmentById(id);可以用来监听该任务对应的返回栈信息,当该返回栈状态发生改变时,执行对应的onBackStackChanged() 方法
[java] view plain copy manager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { Toast.makeText(MainActivity.this, "返回堆状态发生改变", 1).show(); } });模拟用户点击返回键,将指定的fragment从返回栈中弹出,该操作为异步的。前提是该fragment对象使用.beginTransaction().addToBackStack("right")添加了进返回栈
[java] view plain copy manager.popBackStack(); //Pop the top state off the back stack事务主要包含一些操作的集合,比如增加移除替换,动画设置等等
[html] view plain copy /* * 通过manager开启一个事务,该事务包含一些操作的集合,通事务可以 add(), remove(), replace() * 完成对Fragment的操作,并使用commit()提交 */ FragmentTransaction transaction = manager.beginTransaction(); transaction.replace(R.id.right, new RightFrag(), "right"); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);//设置动画 transaction.addToBackStack("right"); // 将该fragment加入返回堆 // 提交事务 transaction.commit();生命状态
周期过程
foreground lifetime
onResume(A)
onResume(F)
onPause(F)
onPause(A)
visible lifetime
onCreateView(F)
onActivityCreated(F)
onStart(A)
onStart(F)
onResume(A)
onResume(F)
onPause(F)
onPause(A)
onStop(F)
onStop(A)
onDestroyView(F)
entire lifetime
完整的生命周期
当前Fragment与Activity关联,调用!
onCreate()完成fragment的初始化创建
onCreateView()创建并返回与当前fragment相关联的层次视图view
onActivityCreated()主activity的onCreate()执行完后,该方法才执行
onStart()fragment可见,当主activity处于started状态后执行
onResume()fragment能与用户交互,当主activity处于resumed状态后执行
onPause()fragment不在与用户交互,可能在主activity将要处于paused前执行,可能该fragment被修改
onStop()fragment不在可见,可能在主activity将要处于stopped前执行,可能该fragment被修改
onDestroyView()允许该fragment清理视图相关资源
onDestroy()清理掉视图state信息
onDetach()该fragment不在于activity关联