碎片(Fragment)是一种可以嵌入在活动中的UI片断,它能让程序更加合理和充分地利用大屏幕的空间,它与活动相似,可以简单的理解为一个迷你型的活动,它也有自己的生命周期。碎片在平板的应用非常广泛。

一、碎片的简单用法

需求:在一个活动中添加两个碎片,并让这两个碎片平分活动空间。

第一步:由于碎片通常应用在平板开发中,所以先创建一个平板模拟器,然后新建一个Android项目:FragmentTest

第二步:创建左侧、右侧两个碎片布局

   

第三步:新建一个LeftFragment类继承Fragment.

  注意:继承Fragment会有两个不同包下的Fragment供你选择,一个是系统内置的:android.app.Fragment,一个是support-v4库中的:android.support.v4.app.Fragment. 这里强烈建议使用support-v4库中的Fragment,因为它可以让碎片在所有的Android系统版本中保持功能的一致性;而系统内置的Fragment有Android系统版本的限制。另外使用support-v4库中的Fragment,不需要在build.gradle文件中添加support-v4库的依赖,因为build.gradle文件中已经添加了appcompat-v7库的依赖,这个库会将support-v4库也一起引入进来。

第四步:同第三步,创建RightFragment,并继承Fragment

第五步:在activity_main中通过:fragment标签添加碎片。添加的碎片要带上完整包名

第六步:运行程序,效果如下

 二、动态添加碎片

接着上面的代码修改:

第一步:新建一个another_right_fragment.xml

第二步:新建AnotherRightFragment类作为另外一个右侧碎片

第三步:在activity_main.xml文件中,把右侧改为FrameLayout布局

  FrameLayout布局是Android中最简单的一种布局,所有的控件默认都会摆在布局的左上角,由于这里只需要在布局中加入一个碎片,所以非常适合使用FrameLayout

第四步:在MainActivity活动中为FrameLayout布局添加内容,实现动态的添加碎片

第五步:运行程序,效果展示(左),点击Button按钮,效果展示(右)

   

总结:

动态添加碎片的步骤分为5步:

  1、创建待添加碎片的实例(new RightFragment())

  2、获取FragmentManager,通过直接在活动中调用:getSupportFragmentManager()方法得到

  3、开启一个事务:beginTransaction()

  4、向容器(布局)添加或替换碎片:replace()方法,传入两个参数:存放碎片的容器id,需要存放的碎片名称

  5、提交事务:commit()方法

拓展:

  在上面的动态添加碎片的代码中,我们点击Button按钮替换右侧的碎片为:AnotherRightFragment 后,如果点击Back键,就会直接退出程序,而不会返回到上一个碎片。如果我们想要通过点击Back键回到上一个碎片应该怎么做呢?

  在FragmentTransaction中有一个方法:addToBackStack()方法,用于将一个事务添加到返回栈中,它可以接收一个名字用于描述返回栈的状态,一般传入:null 即可。这个方法在提交事务之前调用(即调用:commit()方法之前)

三、碎片与活动之间的通信

1、在活动中创建碎片实例:FragmentManager提供了一个:findFragmentById()方法,可以在活动中得到相应碎片的实例,然后就能轻松地调用碎片里面的方法了

  注意:获取FragmentManager的方法有两个:一个是系统内置的:getFragmentManager(),一个是support-v4库中的:getSupportFragmentManager()方法,根据自己程序中引用的包来选择。

  2、在碎片中创建活动的实例:每个碎片都可以通过:getActivity()方法来得到和当前碎片相关联的活动实例,有了活动实例之后,在碎片中调用活动里的方法就变得轻而易举了。另外,当碎片中需要Context对象时,也可以使用:getActivity()方法,因为活动本身就是一个Context对象。

  3、碎片与碎片之间的通信:首先在一个碎片中得到与它关联的活动,然后通过这个活动去获取另外一个碎片的实例,这样就实现了不同碎片之间的通信功能。

 四、碎片的生命周期

  1、碎片运行状态:一个碎片可见,且它所关联的活动正处于运行状态

  2、碎片暂停状态:当一个活动进入暂停状态(另一个未占满屏幕的活动处于栈顶),与该活动关联的可见碎片就会进入暂停状态

  3、碎片停止状态:当一个活动进入停止状态,那么与它关联的碎片也进入了停止状态。总体来说,进入停止状态的碎片对用户来说是完全不可见的,有可能被系统回收。

  4、碎片销毁状态:活动销毁时,与它关联的碎片也进入销毁状态。

  5、通过调用FragmentTransaction的:remove()、replace()方法能让碎片从活动中移除,但是如果事务提交之前调用了:addToBackStack()方法,这时的碎片也会进入停止状态;如果在事务提交之前没有调用:addToBackStack()方法,这是碎片进入销毁状态。

  6、Fragment类中提供了一系列的回调方法,以覆盖碎片生命周期的每个环节,其中活动有的回调方法,碎片几乎都有,不过碎片还附加了一些回调方法:

      onAttach():当碎片和活动建立关联的时候调用

      onCreateView():当碎片创建视图(加载布局)的时候调用

      onActivityCreate():确保与碎片关联的活动一定已经创建完毕的时候调用

      onDestroyView():当碎片关联的视图(布局)被移除的时候调用

      onDetach():当碎片和活动解除关联的时候调用

  7、碎片的完整生命周期示意图:

  8、体验碎片的生命周期:

第一步:修改RightFragment碎片中的代码

第二步:运行程序,打印日志:

第三步:点击Button按钮,替换当前碎片,打印日志

第四步:点击Back键,打印日志

第五步:再按Back键,打印日志

拓展:

  在碎片中你也可以通过:onSaveInstanceState()方法来保存数据,因为进入停止状态的碎片有可能在系统内存不足的时候被回收,保存下来的数据在onCreate()、onCreateView()、onActivityCreate()这三个方法中都可以重新得到,他们都包含了一个Bundle类型的onSaveInstanceState参数。代码可以参考:https://www.cnblogs.com/hh8888-log/p/9873057.html

五、动态加载布局的技巧

  程序能够根据设备的分辨率或屏幕的大小在运行时决定加载哪种布局

方法一:使用限定符(Qualifiers)

  Android中常见的限定符如下:

下面我们使用:large 限定符来模拟手机自动加载单页模式,平板自动加载双页模式:

第一步:把activity_main.xml布局设置为单页模式

第二步:在res目录下新建layout-large文件夹,在该文件夹下新建:activity_main.xml,将该布局设置为双页模式:

第三步:在MainActivity活动中将replaceFragment方法中的代码注释掉

第四步:在平板模拟器上运行程序(左)和在手机模拟器上运行程序(右)

    结果显示:在平板模拟器上运行程序的时候,会自动加载:large/activity_main.xml布局;在手机模拟器上运行程序的时候,会自动加载:layout/activity_main.xml布局。

    

方法二:使用最小宽度限定符(Smallest-width Qualifiers)

  最小宽度限定符:对屏幕宽度指定一个最小值(以dp为单位),以这个最小值为临界点,屏幕宽度大于这个值的设备加载一个布局,屏幕宽度小于这个值的设备加载另外一个布局。

例如:

  在res目录下新建一个文件夹:layout-sw600dp,然后在该文件夹下新建:activity_main.xml,代码如下,当程序在屏幕宽度大于600dp的设备上运行时,会自动加载:sw600dp/activity_main.xml布局,当程序在屏幕宽度小于600dp的设备上运行时,会自动加载:layout/activity_main.xml布局。

Android学习之基础知识七—碎片的使用的更多相关文章

  1. Android学习之基础知识七—碎片的最佳实践

    一.Android碎片(Fragment)的最佳实践——简易版新闻应用 第一步:新建FragmentBestPractice项目,在app/build.gradle当中添加:RecyclerView ...

  2. Android学习之基础知识十三 — 四大组件之服务详解第一讲

    一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...

  3. Android学习之基础知识十五 — 最佳UI体验(Material Design实战)

    一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...

  4. Android学习之基础知识十—内容提供器(Content Provider)

    一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...

  5. Android学习之基础知识十四 — Android特色开发之基于位置的服务

    一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...

  6. Android学习之基础知识十一 —运用手机多媒体

    一.使用通知(Notification) 通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助 ...

  7. Android学习之基础知识十六 — Android开发高级技巧的掌握

    一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...

  8. Android学习之基础知识十二 — 第一讲:网络技术的使用

    这一节主要讲如何在手机端使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析,这也是Android中最常用的网络技术. 一.WebView的用法 有时候我们可能会碰到比较特殊的需求,比 ...

  9. Android学习之基础知识五—Android常用的七大控件

    一.TextView控件:在界面上显示一段文本信息 先看XML代码和执行效果:         代码分析: 1.android:id属性,给当前控件定义了一个唯一的标识符 2.android:layo ...

随机推荐

  1. 对Spring中IOC和DI的理解

    前几篇讲了Spring中IOC和DI的用法,本篇应该放到三篇之前,但一直没有想到好的讲解方式,后参考https://blog.csdn.net/luoyepiaoxue2014/article/det ...

  2. Oracle总结二

    1 where子句 Where子句的作用:用where子句来指定查询条件 1.1 用法示例 select * from emp where deptno=10; select * from emp w ...

  3. SQL Server: create table sql script

    ---摇奖observeh数据库设计 Function getSpace lottery /* -- Author:geovindu 涂聚文 -- Date: 20180427 为了自写生成代码.根据 ...

  4. csharp: DefaultValueAttribute Class

    public class CalendarEvent { public int id { get; set; } public string title { get; set; } public st ...

  5. 七牛云java(服务端)通用工具类

    前言 需要安装lombok插件. 功能列表 上传本地文件 上传Base64图片 获取文件访问地址 上传MultipartFile 代码 pom.xml <dependency> <g ...

  6. c3p0死锁

    1.APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 抛出以下异常信息: com.mchang ...

  7. twindows下omcat8安装后,不能启动服务

    原因可能是cmd安装时,不是以管理员的身份运行cmd命令的.解决办法,以管理员身份运行cmd,进入tomcat安装/解压的bin目录下,先执行 service.bat remove 命令卸载服务,之后 ...

  8. SoapUI 访问代理设置

    SoapUI 访问代理设置 by:授客 QQ:1033553122 问题描述: 运行SoapUI时,发现接口访问不通,如下图,提示"Connection to http://127.0.0. ...

  9. .Net Core(三)MVC Core

    MVC Core的改动感觉挺大的,需要的功能大多从Nuget安装,还内置了IOC,支持SelfHost方式运行等等. 一.项目结构的变化创建的新MVC项目的结构发生了变化,比如:静态文件需要统一放置到 ...

  10. Python创建空DataFrame及添加行数据

    # 创建空DataFrame df = pd.DataFrame(columns = ['YJML','EJML','SJML','WZLB','GGXHPZ','CGMS']) # 插入数据(忽略索 ...