FragmentTransaction

FragmentManager:能够实现管理activity中fragment.通过调用activity的getFragmentManager()取得它的实例.。

FragmentTransaction:对fragment进行添加,移除,替换,以及执行其他动作。

1、FragmentTransaction

FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每一个事务都是同时要执行的一套变化.可以在一个给定的事务中设置你想执行的所有变化,使用诸如 add(), remove(), 和 replace().然后, 要给activity应用事务, 必须调用 commit()。


在调用commit()之前, 你可能想调用 addToBackStack(),将事务添加到一个fragment事务的back stack,这个back stack由activity管理, 并允许用户通过按下 BACK 按键返回到前一个fragment状态。

例如:将一个fragment替换为另一个, 并在后台堆栈中保留之前的状态

// Create new fragment and transaction  Fragment newFragment = new ExampleFragment();  FragmentTransaction transaction = getFragmentManager().beginTransaction();  // Replace whatever is in the fragment_container view with this fragment,and add the transaction to the back stack  transaction.replace(R.id.fragment_container, newFragment);  
transaction.addToBackStack(null);  // Commit the transaction  transaction.commit();

在这个例子中, newFragment 替换了当前layout容器中的由R.id.fragment_container标识的fragment。通过调用 addToBackStack(), replace事务被保存到back stack, 因此用户可以回退事务,并通过按下BACK按键带回前一个fragment。

如果添加多个变化到事务(例如add()或remove())并调用addToBackStack(), 然后在你调用commit()之前的所有应用的变化会被作为一个单个事务添加到后台堆栈, BACK按键会将它们一起回退。

添加变化到 FragmentTransaction的顺序不重要, 除以下例外:

  • 必须最后调用 commit()
  • 如果添加多个fragment到同一个容器, 那么添加的顺序决定了它们在view hierarchy中显示的顺序。当执行一个移除fragment的事务时, 如果没有调用 addToBackStack(), 那么当事务提交后, 那个fragment会被销毁,并且用户不能导航回到它. 有鉴于此, 当移除一个fragment时,如果调用了 addToBackStack(), 那么fragment会被停止, 如果用户导航回来,它将会被恢复.

提示:对于每一个fragment事务, 你可以应用一个事务动画, 通过在提交事务之前调用setTransition()实现。

调用 commit() 并不立即执行事务,恰恰相反, 它将事务安排排期, 一旦准备好, 就在activity的UI线程上运行(主线程)。如果有必要, 无论如何, 你可以从你的UI线程调用 executePendingTransactions() 来立即执行由commit()提交的事务.但这么做通常不必要, 除非事务是其他线程中的job的一个从属。

警告:你只能在activity保存它的状态(当用户离开activity)之前使用commit()提交事务。

如果你试图在那个点之后提交, 会抛出一个异常.这是因为如果activity需要被恢复, 提交之后的状态可能会丢失。对于你觉得可以丢失提交的状况, 使用 commitAllowingStateLoss()。

http://www.android-doc.com/reference/android/support/v4/app/FragmentTransaction.html

2、常用方法

使用add()加入fragment时将触发onAttach(),使用attach()不会触发onAttach();

使用replace()替换后会将之前的fragment的view从viewtree中删除。

触发顺序:

detach()->onPause()->onStop()->onDestroyView();

attach()->onCreateView()->onActivityCreated()->onStart()->onResume()

使用hide()方法只是隐藏了fragment的view并没有将view从viewtree中删除,随后可用show()方法将view设置为显示。

而使用detach()会将view从viewtree中删除,和remove()不同,此时fragment的状态依然保持着,在使用attach()时会再次调用onCreateView()来重绘视图。注意使用detach()后fragment.isAdded()方法将返回false,在使用attach()还原fragment后isAdded()会依然返回false(需要再次确认)。

执行detach()和replace()后要还原视图的话, 可以在相应的fragment中保持相应的view,并在onCreateView()方法中通过view的parent的removeView()方法将view和parent的关联删除后返回。

更多相关文章

  1. 图片旋转的两种方法
  2. 【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI
  3. android sdk 兼容低版本的处理方法
  4. Android后端服务器的搭建方法
  5. 保持Android手机屏幕长亮的方法
  6. Android 崩溃分析 方法论
  7. Android studio中正确引入so文件的方法
  8. Android代码混淆及项目发布方法记录

随机推荐

  1. .net程序员业余Android开发赚点外快(介绍
  2. Android优势和劣势分析(面试华为的人有被
  3. Android动画效果 translate、scale、alph
  4. 安卓一些错误的总结
  5. 阿里巴巴的FastJson数据解析介绍
  6. Android内核开发:如何统计系统的启动时间
  7. 继续群发Android游戏源码(再发15款)
  8. Android(安卓)Native OpenGL应用前后台切
  9. Android camera系统开发之IPC (一)
  10. Android(安卓)SD卡 路径问题