今天讲解一下Fragment的控制,主要是切换View和页面替换等操作。还有就是如何获取Fragment的管理对象,以及与Activity的通信方式。

1、管理Fragment要在activity中管理fragment,需要使用FragmentManager. 通过调用activity的getFragmentManager()取得它的实例.

•可以通过FragmentManager做一些事情, 包括: 使用findFragmentById()(用于在activity layout中提供一个UI的fragment)或findFragmentByTag()(适用于有或没有UI的fragment)获取activity中存在的fragment。

•将fragment从后台堆栈中弹出, 使用 popBackStack() (模拟用户按下BACK 命令)。

•使用addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener。

2、处理Fragment事务关于在activity中使用fragment的很强的一个特性是:根据用户的交互情况,对fragment进行添加、移除、替换以及执行其他动作。提交给activity的每一套变化被称为一个事务,可以使用在FragmentTransaction中的 API 处理。我们也可以保存每一个事务到一个activity管理的backstack,允许用户经由fragment的变化往回导航(类似于通过 activity往后导航)。

从 FragmentManager 获得一个FragmentTransaction实例:

FragmentManager fragmentManager =getFragmentManager();

FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();

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

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

//创建修改实例

Fragment newFragment = newExampleFragment();

FragmentTransaction transaction =getFragmentManager().beginTransaction();

// Replace whatever is in thefragment_container view with this fragment,

// and add the transaction to the backstack

transaction.replace(R.id.fragment_container,newFragment);

transaction.addToBackStack(null);

//提交修改

transaction.commit();

上面是如何将一个fragment替换为另一个,并在后台堆栈中保留之前的状态。在这个例子中,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()提交的事务。但这么做通常不必要,除非事务是其他线程中的任务的一个从属。

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

3、与Activity通信尽管Fragment被实现为一个独立于Activity的对象,并且可以在多个activity中使用,但一个给定的fragment实例是直接绑定到包含它的activity的。 特别的fragment可以使用 getActivity() 访问Activity实例, 并且容易地执行比如在activity layout中查找一个view的任务。如下面的代码:

View listView =getActivity().findViewById(R.id.list);

同样地,activity可以通过从FragmentManager获得一个到Fragment的引用来调用fragment中的方法,使用findFragmentById() 或 findFragmentByTag()。

ExampleFragment fragment =(ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

4、总结最后需要说一下Fragment的例子,Android官方已经提供了Fragment的各种使用的Demo例子,在我们SDK下面的API Demo里面就包含了Fragment的各种使用例子,需要看Demo的朋友,直接看API Demo那个程序就可以了,不用到处去找。里面分开不同功能,实现了不同的类。可以根据需要查看具体代码。

android单个页面切换_Android基础之使用Fragment控制切换多个页面相关推荐

  1. android 调出键盘表情_Android 软键盘和emoji表情切换方案,和微信几乎一样的体验...

    注意:本项目还有一个小坑.第一次进去的时候有时候输入框没有得到焦点,没有弹出软键盘,所以不能更好的量取软键盘高度,给了一个默认值787 软键盘默认高度.所以可以忽略不计,一旦弹出了软键盘,这个高度就被 ...

  2. android odex版本调试_android 基础-Dalvik ,ART,JIT,AOT,Dex,Odex

    Dalvik 和 ART Dalvik:Dalvik 虚拟机,android 5.0 以前所使用的虚拟机,可执行文件为 dex 格式,基于寄存器的虚拟机(jvm 基于堆栈).通过 dx 工具将 .cl ...

  3. android tablayout 字体颜色,Tablayout变颜色 以及Fragment进行切换

    第一步 在Xml 中 android:layout_width="match_parent" android:layout_height="match_parent&qu ...

  4. Android基础篇 屏幕横竖屏切换(layout-land)下篇

    默认情况下Activity进行屏幕旋转会自动进行onDestroy并重新onCreate 一.非默认情况下 在AndroidManifest.xml的Activity中配置 <activitya ...

  5. Android Studio使用recyclerview实现展开和折叠(在之前的微信页面基础之上)

    Android Studio使用recyclerview实现展开和缩回(在之前的微信页面基础之上) Android中RecyclerView点击item展开列表详细内容 github源码地址: And ...

  6. android中有关的计算机网络基础

    一.网络协议 计算机网络是什么? 随着计算机技术发展,计算机的体积和价格都在下降,之前计算机多用于研究机构,现阶段逐步进入一般的公司用于办公.原来计算机之间传输数据需要通过软盘等第三方存储介质进行转存 ...

  7. Android NDK开发之 NEON基础介绍

    原文:http://blog.csdn.net/app_12062011/article/details/50434259 Android NDK开发之 NEON基础介绍 这是官方介绍: http:/ ...

  8. 轻松搞定表白女朋友:Android版APP (零基础也可直接下载软件)

    轻松搞定表白女朋友:Android版软件 (零基础也可直接下载软件) 在我们平时生活当中,经常会看到一些表白女朋友的html网页,但是Android端的表白软件可以说是基本没有,笔者在全网搜了一下,就 ...

  9. Android 并发/多线程 的基础与应用

    本篇文章主要目的为总结 覆盖80%场景的20% Android端并发所需基础知识和应用. Android 端应用主要使用 Java 语言开发,所以基础与 Java 的并发基础基本一样,深入了解推荐细读 ...

最新文章

  1. 神经网络入门——12梯度下降代码
  2. Java设计模式(二十二):原型设计模式
  3. python文件名带日期变量_Python实现文件按照日期命名的方法
  4. Angular定义服务-Learn By Doing
  5. Laravel核心解读--完结篇 1
  6. Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化
  7. python循环语句打印矩形_pycharm软件python的一些循环语句的用法
  8. 个人博客升级改造ing
  9. C#毕业设计——基于C#+asp.net+sqlserver的网上书店系统设计与实现(毕业论文+程序源码)——网上书店系统
  10. 收藏已久免费下载软件的黑科技网站
  11. 此nvidia驱动程序与此windows版本不兼容
  12. 深入浅出傅里叶变换(目前看到的讲得最好的一篇文章)
  13. 面向对象_猫狗案例加入跳高功能分析
  14. 【广告联盟电商SEO】广告联盟网站收集
  15. 4. 卷积神经网络CNN
  16. 从购置阿里云学生机到开发部署一个SpringBoot+Vue项目全过程
  17. 什么是线程(基础系列一)
  18. [PTA]实验10-1 圆形体体积计算器
  19. 手机网站将会消失,未来混合开发app将成最大的趋势
  20. AttributeError: module ‘win32com.gen_py.00062FFF-0000-0000-C000-000000000046x0x9x6‘ has no attribute

热门文章

  1. 项目投标注意点001---项目投标那点事
  2. java在线支付---04_编写易宝支付的客户端加密工具类
  3. eclipse 编码设置之BOM丢失
  4. LINUX让环境变量立即生效的方法
  5. mysql 特殊函数_mysql 的特殊函数
  6. 机器学习与计算机视觉(FPGA的图像处理方法)
  7. C语言和设计模式(代理模式)
  8. 一步一步写算法(之双向链表)
  9. qtabbar设置不同宽度_透水地坪需要设置伸缩缝吗?
  10. openlayers小车_openlayer 车辆跟着轨迹移动