要管理fragment们,需使用FragmentManager,要获取它,需在activity中调用方法getFragmentManager()。

你可以用FragmentManager来做以上事情:

1使用方法findFragmentById()或findFragmentByTag(),获取activity中已存在的fragment们。

2使用方法popBackStack()从activity的后退栈中弹出fragment们(这可以模拟后退键引发的动作)。

3用方法addOnBackStackChangedListerner()注册一个侦听器以监视后退栈的变化。

你还可以使用FragmentManager打开一个FragmentTransaction来执行fragment的事务,比如添加或删除fragment。

执行Fragment的事务

在activity中使用fragment的一个伟大的好处是能跟据用户的输入对fragment进行添加、删除、替换以及执行其它动作的能力。你提交的一组fragment的变化叫做一个事务。事务通过FragmentTransaction来执行。你还可以把每个事务保存在activity的后退栈中,这样就可以让用户在fragment变化之间导航(跟在activity之间导航一样)。

你可以通过FragmentManager来取得FragmentTransaction的实例,如下:

  1. FragmentManager fragmentManager = getFragmentManager();
  2. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

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

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

如下例:演示了如何用一个fragment代替另一个fragment,同时在后退栈中保存被代替的fragment的状态。

  1. //Create new fragment and transaction
  2. Fragment newFragment = newExampleFragment();
  3. FragmentTransaction transaction=getFragmentManager().beginTransaction();
  4. //Replace whatever is in the fragment_container view with thisfragment,
  5. //and add the transaction to the backstack
  6. transaction.replace(R.id.fragment_container,newFragment);
  7. transaction.addToBackStack(null);
  8. //Commit the transaction
  9. transaction.commit();

解释:newFragment代替了控件IDR.id.fragment_container所指向的ViewGroup中所含的任何fragment。然后调用addToBackStack(),此时被代替的fragment就被放入后退栈中,于是当用户按下返回键时,事务发生回溯,原先的fragment又回来了。

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

事务中动作的执行顺序可随意,但要注意以下两点:

1. 你必须最后调用commit()。

2. 如果你添加了多个fragment,那么它们的显示顺序跟添加顺序一至(后显示的覆盖前面的)。

如果你在执行的事务中有删除fragment的动作,而且没有调用addToBackStack(),那么当事务提交时,那些被删除的fragment就被销毁了。反之,那些fragment就不会被销毁,而是处于停止状态。当用户返回时,它们会被恢复。

密技:对于fragment事务,你可以应用动画。在commit()之前调用setTransition()就行。――一般银我不告诉他哦。

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

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

 

最新文章

  1. servlet 学习(二)
  2. mysql datetime设置now()无效,直接用程序设置默认值比较好
  3. 使用NuGet时的一个乌龙
  4. VTK三维重建(1)-使用VTK读取DICOM,并动态输出
  5. Map的遍历方式
  6. HTML特效代码大全
  7. HDU - 5156 Harry and Christmas tree
  8. 在后台获取Textarea控件的值
  9. MyBatis CRUD Java POJO操作
  10. Centos7下配置Python3和Python2共存,以及对应版本Ipython安装配置
  11. HBase 架构脑图
  12. ubuntu18.04 pip换源 永久修改
  13. 3年java工作经验必备技能
  14. PHP使用Redis实现消息队列
  15. fiddler——一款莱斯的抓包工具
  16. dbt 的知识文档管理
  17. 第三次Scrum编码冲刺!!!
  18. APDU指令返回码及其代表含义
  19. Android中图片的三级缓存策略
  20. nginx+php整合(是让nginx可以运行php,以及下载地址)

热门文章

  1. Android 自定义控件玩转字体变色 打造炫酷ViewPager指示器
  2. 大数据笔记10:大数据之Hadoop的MapReduce的原理
  3. Fling!
  4. HTML 学习网站
  5. lib,dll区别 及 VS中如何添加lib,dll
  6. IIC 概述之源码仿真
  7. linux内核学习之一:环境搭建--安装Debian7.3
  8. DataTables列过滤器
  9. Activity生命周期的学习以及Logcat的使用
  10. STARTUP.A51详解及如何使能可重入函数