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 ...
随机推荐
- Java 初级软件工程师 认证考试试卷1
Java 初级软件工程师 认证考试试卷 笔试(A卷) 考试时间150分钟 总分 100分 姓 名_______________________ 身份证号_____________ ...
- Docker 镜像运行时区不准确处理
启动 tomcat 容器时发现容器时间与本地时间不一致,相差 8 个小时 docker run -d --rm -p 8888:8080 tomcat:latest # 查看容器 ID docker ...
- loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)
题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...
- ES6中Object.is方法比较两个值是否相等
Object.is: let obj={a:1,b:2}; Object.is(obj,obj);//true Object.is(obj,{obj});//false Object.is({},{} ...
- PostGIS中生成GUID字段值
create extension "uuid-ossp" update base_region set region_id = uuid_generate_v4() update ...
- SQL Server 中的回滚
USE [TestDB] GO /****** 对象: Table [dbo].[Person] 脚本日期: 11/23/2008 13:37:48 ******/ SET ANSI_NULLS ON ...
- mybatis学习--缓存(一级和二级缓存)
声明:学习摘要! MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级) ...
- Jmeter压力测试简单教程(包括服务器状态监控)
前段时间公司需要对服务器进行压力测试,包括登录前的页面和登录后的页面,主要目的是测试负载均衡的实现效果.不知道是不是因为Jmeter不如loadRunner火爆还是什么,网上关于Jmeter的资料有很 ...
- ubuntu16.04系统彻底卸载mysql,并源码免编译重装MySQL的步骤
今天的总结 ubuntu上彻底卸载MySQL或重新安装 https://www.jianshu.com/p/974b33873bca #查看是否存在mysql服务 service mysql stat ...
- Linux 下安装Node.js
安装 node.js 安装包 http://nodejs.org 通过 rz 上传到 CentOS 进行解压 tar -xvf node-v8.0.0-linux-x64.tar.xz 进入到 bin ...