Android学习之基础知识七—碎片的使用

时间:2024-10-20 15:37:44

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

一、碎片的简单用法

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

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

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

Android学习之基础知识七—碎片的使用   Android学习之基础知识七—碎片的使用

第三步:新建一个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库也一起引入进来。

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

 二、动态添加碎片

接着上面的代码修改:

第一步:新建一个another_right_fragment.xml

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

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

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

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用   Android学习之基础知识七—碎片的使用

总结:

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

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

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

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

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

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

拓展:

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

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

Android学习之基础知识七—碎片的使用

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

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

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

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

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

 四、碎片的生命周期

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

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

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

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

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

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

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

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

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

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

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

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

Android学习之基础知识七—碎片的使用

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

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

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

Android学习之基础知识七—碎片的使用

拓展:

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

五、动态加载布局的技巧

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

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

  Android中常见的限定符如下:

Android学习之基础知识七—碎片的使用

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

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

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

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

Android学习之基础知识七—碎片的使用

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

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

Android学习之基础知识七—碎片的使用    Android学习之基础知识七—碎片的使用

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

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

例如:

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

Android学习之基础知识七—碎片的使用