Android学习笔记之探究碎片

(学习参考书:第一行代码第2版)

一、碎片及其使用方式

碎片(fragment)是一种可以嵌入在活动中的UI片段,它能让程序更加合理和充分利用大屏幕的空间。碎片类似于活动,同样能包含布局,有自己的生命周期。

(1)碎片的简单用法

  1. 新建layout布局文件
  2. 新建绑定对应布局文件的类,该类继承Fragment。在该类中重写onCreateView方法
  3. 在要添加该碎片的活动中添加fragment控件,使用属性
    android:name显式指明要添加的碎片类名,要将包名也加上

(2)动态添加碎片
碎片的真正强大之处在于它可以在程序运行时动态的添加到活动中。步骤如下:

  1. 创建待添加的碎片实例
  2. 获取FragmentManager,在活动中可以直接通过调用getSupportFragmentManager()方法得到。
  3. 开启一个事务,通过调用beginTransaction()方法开启
  4. 向容器中添加或替换碎片,一般使用replace方法实现,需要传入容器的id和待添加的碎片实例
  5. 提交事务。调用commit()方法来完成

(3)在碎片中模拟返回栈
如果在动态添加/更改碎片后想通过Back键返回上一个碎片,即实现类似返回栈的效果。可以这样实现:
FragmentTransaction中提供了一个addToBackStack()方法,它可以用于将一个事务添加到返回栈中。

transaction.addToBackStack(null);

在事务提交前调用方法,它可以接受一个名字用于描述返回栈的状态,一般传入null即可。

(4)碎片和活动间的通信
虽然碎片都是嵌入在活动中显式,但是碎片和活动都是各自存在于一个独立的类当中的,它们之间没有明显的方式直接进行通信。
为了方便碎片和活动之间进行通信,FragmentManager提供了一个类似于findViewById()的方法,专门用于从布局文件获取碎片的实例。代码如下:

MyFragment myFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.my_fragment);
(MyFragment是自定义的碎片类,my_fragment是碎片的布局文件。)

调用FragmentManager的findFragmentById()方法就可以在活动中获得相应实例,然后轻松调用碎片里的方法
同样的,在每个碎片中通过调用getActivity()方法来得到和当前碎片相关的活动实例。

MainActivity activity = (MainActivity) getActivity();

当碎片需要使用Context对象时,也是使用该方法
碎片与碎片间通信的方法就是通过中间活动实现。

二、碎片的生命周期

运行状态:当一个碎片可见并且它所关联的活动处于运行状态,该碎片也处于运行状态。

暂停状态:当一个活动进入暂停状态,与它相关联的可见碎片也会进入到暂停状态

停止状态:当一个活动进入停止状态,与其相关联的碎片会进入到停止状态。或者FragmentTransaction的remove(),replace()方法将碎片从活动中移除,但如果在事务提交之前使用addToBackStack()方法,这时的碎片也会进入停止状态。进入停止状态的碎片对用户完全不可见,有可能被系统回收。

销毁状态:当一个活动进入销毁状态,与其相关联的碎片会进入到销毁状态。或者FragmentTransaction的remove(),replace()方法将碎片从活动中移除,但在事务提交之前并没有使用addToBackStack()方法,这时的碎片也会进入销毁状态。

Fragment类中提供了一系列的回调方法,以覆盖碎片生命周期的每个环节,活动中的回调方法碎片都有除此之外,碎片还有一部分附加的回调方法

onAttach() 当碎片和活动建立联系时调用
onCreateView() 为碎片加载布局时调用
onActivityCreated() 确保与碎片相关联的活动一定已经创建完毕时调用
onDestoryView() 当与碎片关联的视图被移除的时候调用
onDetach() 当碎片和活动解除关系时调用

三、动态加载布局的技巧

为了满足在不同尺寸和分辨率设备上加载布局的不同,需要使用限定符来决定设备加载的布局文件。Android常见的限定符:

在这里插入图片描述

使用方法:在res目录下新建布局文件layout-Qualifier,这里的Qualifier对应上述的限定符,再在该文件夹下创建同名布局文件

最小宽度限定符:在res目录下新建布局文件layout-swXXXdp,当程序运行到屏幕宽度大于XXX的设备时,会认加载该文件夹下的布局文件。程序运行到屏幕宽度小于XXX的设备时,会认加载普通的布局文件

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...