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布局。

原文地址:https://www.cnblogs.com/hh8888-log/p/10041217.html

时间: 2024-09-30 20:52:05

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

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

一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动设备所在的位置,而这种技术早在很多年前就已经出现了. 那么为什么LBS技术直到最近几年才开始流行呢?这主要是因为,在过去移动设备的功能及其有限,即使定位到了设备所在的位置,也就仅仅只是定位到了而已,我们并不能在位置的基础上进行一些其他的操作.而现在就大大不同了,有了Android系统作为载体,我们可

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

一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到Context而发愁,因为我们很多地方都是在活动中进行的,而活动本身就是一个Context对象,但是,当应用程序的架构逐渐开始复杂起来的时候,很多的逻辑代码都将脱离Activity类,但此时又恰恰需要使用Context,特许这个时候就会感到有些伤脑筋了. 举个例子,在前面网络编程的最佳实践中,我们编写

Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库

上一节学习了使用SQLiteDatabase来操作SQLite数据库的方法,接下来我们开始接触第一个开源库:LitePal.LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作,LitePal的项目主页上也有详细的使用文档,地址是: https://github.com/LitePalFramework/LitePal 一.配置LitePal 要在

Android学习之基础知识十三—网络编程的最佳实践

上一讲已经掌握了HttpURLConnection和OkHttp的用法,知道如何发起HTTP请求,以及解析服务器返回的数据,但是也许你还没发现,之前我们的写法其实是很有问题的,因为一个应用程序很可能会在许多地方使用到网络功能,而发送HTTP请求的代码基本都是相同的,如果我们每次都去编写一遍发送HTTP请求的代码,这显然是非常差劲的做法. 通常情况下我们都应该将这些通用的网络操作提取到一个公共的类里,并提供一个静态方法,当想要发起网络请求的时候,只需要简单的调用一下这个方法即可,比如使用如下的写法

Android学习之基础知识二(build.gradle文件详解)

一.详解build.gradle文件 1.Android Studio是采用Gradle来创建项目的,Gradle是非常先进的构建的项目的工具,基于Groovy领域特定的语言(DSL)来声明项目配置,摒弃了传统基于XML(如Ant.Maven)的各种烦琐的配置. 2.Android项目中存在两个build.gradle文件,一个在外层,一个在app中: A.外层的build.gradle文件:当需要添加全局的项目构建配置时才修改其中的内容 jcenter():代码托管仓库,存放Android开源

Android学习之基础知识八—Android广播机制

一.广播机制简介 Android提供了一套完整的API,允许应用程序自由的发送和接受广播,发送广播借助于我们之前学过的:Intent,而接收广播需要借助于广播接收器(Broadcast Receiver) 广播的类型主要分为两种:标准广播和有序广播. 标准广播:一种完全异步执行的广播,在广播发出之后,所有接收器几乎在同一时刻接收到这条广播消息,因此它们之间没有任何的先后顺序可言,这种广播的效率会比较高,但是同时也意味着它无法被截断的.标准广播的工作流程图如图所示: 有序广播:一种同步执行的广播,

Android学习之基础知识八—Android广播机制实践(实现强制下线功能)

强制下线功能算是比较常见的了,很多的应用程序都具备这个功能,比如你的QQ号在别处登录了,就会将你强制挤下线.实现强制下线功能的思路比较简单,只需要在界面上弹出一个对话框,让用户无法进行任何操作,必须要点击对话框中的确定按钮,然后回到登录界面即可.下面我们就来一步一步的实现这个功能: 第一步:创建一个活动管理器ActivityCollector,用于管理所有的活动 第二步:创建所有活动的父类BaseActivity,继承AppCompatActivity 因为所有的活动都是继承该活动,所有我们在该

Ant学习-001-ant 基础知识及windows环境配置

一.Ant 概要基础知识 Apache Ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发,用以构建应用,或结合其他开源测试工具例如 git.TestNG等搭建持续集成测试开发环境,从而高效.高质量的构建产品. Ant 有以下一些优点: 跨平台,可移植.Ant 是 Java 语言编写的,所以有很好的跨平台性和可移植性,无论是在 windows.Linux,还是 mac. 操作简单. Ant 是由一个内置任务和可选任务组成的,运行时需要一个构

hadoop学习笔记——基础知识及安装

1.核心 HDFS  分布式文件系统    主从结构,一个namenoe和多个datanode, 分别对应独立的物理机器 1) NameNode是主服务器,管理文件系统的命名空间和客户端对文件的访问操作.NameNode执行文件系统的命名空间操作,比如打开关闭重命名文件或者目录等,它也负责数据块到具体DataNode的映射 2)集群中的DataNode管理存储的数据.负责处理文件系统客户端的文件读写请求,并在NameNode的统一调度下进行数据块的创建删除和复制工作. 3)NameNode是所有