Android学习之基础知识七—碎片的使用
碎片(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学习之基础知识七—碎片的使用的更多相关文章
- Android学习之基础知识七—碎片的最佳实践
一.Android碎片(Fragment)的最佳实践——简易版新闻应用 第一步:新建FragmentBestPractice项目,在app/build.gradle当中添加:RecyclerView ...
- Android学习之基础知识十三 — 四大组件之服务详解第一讲
一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
- Android学习之基础知识十五 — 最佳UI体验(Material Design实战)
一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...
- Android学习之基础知识十—内容提供器(Content Provider)
一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...
- Android学习之基础知识十四 — Android特色开发之基于位置的服务
一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...
- Android学习之基础知识十一 —运用手机多媒体
一.使用通知(Notification) 通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助 ...
- Android学习之基础知识十六 — Android开发高级技巧的掌握
一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...
- Android学习之基础知识十二 — 第一讲:网络技术的使用
这一节主要讲如何在手机端使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析,这也是Android中最常用的网络技术. 一.WebView的用法 有时候我们可能会碰到比较特殊的需求,比 ...
- Android学习之基础知识五—Android常用的七大控件
一.TextView控件:在界面上显示一段文本信息 先看XML代码和执行效果: 代码分析: 1.android:id属性,给当前控件定义了一个唯一的标识符 2.android:layo ...
随机推荐
- 设计模式之模板方法模式(TemplateMethod)
模板方法模式使用继承来实现模式的功能,在基类使用一个方法来定义算法的各个步骤,这些步骤(方法)的具体实现会放到子类中,通过这样来实现不同算法对象的算法拼合,完成该对象整体算法的实现. 作用 模板方法中 ...
- PHP与.Net的区别(一)接口
一.关于接口成员 PHP的接口成员只能包括两种: 1.函数签名 2.常量 .Net的接口成员只能包括三种: 1.函数签名 2.属性(注意:是属性,不是字段) 3.事件 4.索引器(也叫有参属性)
- sqlserver配置实践
对于一套新的sqlserver服务器,我们首先要对它做一些必要的优化配置,确保在生产上比较长的时间段内可以比较稳定的,良好的运行. 新的sqlserver服务器上安装的sqlserver版本,可以选择 ...
- .Net Core 2.0 生态(1).NET Standard 2.0 特性介绍和使用指南
.NET Standard 2.0 发布日期:2017年8月14日 公告原文地址 前言 早上起来.NET社区沸腾了,期待已久的.NET Core 2.0终于发布!根据个人经验,微软的产品一般在2.0时 ...
- localStorage,sessionStorage的使用
最近因为项目上需要使用到客户端存储,所以稍微研究了一下,以下说说自己的理解和使用经验 1.调用方法相同 各自都包含以下几种操作: //根据key获取对应的值; window.sessionStorag ...
- 在ASP.NET Core 2.0 web项目中使用EntityFrameworkCore
一.安装EFCode包 EFCore需要根据不同的数据库选择不同的数据库提供程序database provider,各数据库的包地址:https://docs.microsoft.com/zh-cn/ ...
- 统计分页一些sql
USE [QPTreasureDB] GO /****** Object: StoredProcedure [dbo].[GameStatistics] Script Date: 2018/8/16 ...
- weblogic CVE-2018-2628漏洞利用工具
weblogic CVE-2018-2628漏洞利用 漏洞环境: Windows2018R2 weblogic10.3.6 漏洞利用过程: 搭建好存在CVE-2018-2628漏洞的weblogic平 ...
- 【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】
一.多继承 案例1:小孩继承自爸爸,妈妈.在程序入口模块再创建实例调用执行 #father模块 class Father(object): def __init__(self,money): self ...
- 【错误记录】PowerShell 超级无语的语法错误(令人怀疑人生)
曾经做过测试,本文是本章优秀测试人员的精神,必须定位到原因,不然吃不下饭.其实可以很容易绕过这种问题. 环境: PowerShell 5.1.16299.64 Windows 10 现有代码如下: # ...