14读书笔记之碎片的生命周期:

来源:互联网 发布:数据网站 编辑:程序博客网 时间:2024/06/02 00:17

和活动一样,碎片也有自己的生命周期,并且它和活动的生命周期实在是太像了。

碎片的状态和回调。

活动在生命周期内可能会有运行状态,暂停状态,停止状态,和销毁状态这四种。
类似的,每个碎片在其生命周期内也可能会经历着几种状态,只不过在细节的地方会有部分区别。

1.运行状态

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

2.暂停状态

当一个活动进入暂停状态时,(由于另一个未占满屏的活动被添加到了栈顶),与它相关联的可见碎片就会进入到暂停状态。

3.停止状态

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

4.销毁状态

碎片总是依附于活动而存在的,因此当活动被销毁时,与它相关联的碎片就会进入到销毁状态。或者通过调用FragmentTransaction的remove(),replace()方法将碎片从活动中移除,但在事务提交之前并没有调用addToBackStack(),这时的碎片也会进入到销毁状态。
同样的,Fragment类中也提供了一系列的回调方法,以覆盖碎片生命周期的每一个环节。其中,活动中有的回调方法,碎片中几乎都有,不过碎片还提供了一些附加的回调方法。

OnAttach().

当碎片和活动建立关联的时候调用。

OnCreateView()

为碎片创建视图(加载布局)时调用

OnActivityCreated().

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

OnDestroyView().

当与碎片关联的视图被移除的时候调用。

OnDetach().

当碎片和活动解除关联的时候调用。

碎片完整的生命周期示意图可参考图为:
生命周期

动态加载布局的技巧

虽然动态添加碎片的功能很强大,可以解决很多实际开发中的问题,但是它毕竟是在一个布局文件中进行一些添加和替换的操作。如果程序能够根据设备的分辨率或屏幕大小在运行时来决定加载哪个布局,那我们可发挥的空间就更多了。

使用限定符

判断程序应该是使用双页模式还是单页模式需要借助限定符(Qualifiers)来实现。
下面通过一个例子来展示。
修改FragmentTest项目中的activity_main.xml文件,代码如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragment    android:id="@+id/left_fragment"    android:name="net.nyist.lenovo.fragmenttest.LeftFragment"    android:layout_width="match_parent"    android:layout_height="match_parent"    /></LinearLayout>

这里将多余的代码都删掉,只留下一个左侧的碎片,并让它充满整个父布局。接着在res目录下新建layout-large文件夹,在这个文件夹下新建一个布局,也叫作activity_main.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragment    android:id="@+id/left_fragment"    android:name="net.nyist.lenovo.fragmenttest.LeftFragment"    android:layout_width="0dp"    android:layout_height="match_parent"    android:layout_weight="1"/><fragment    android:id="@+id/right_fragment"    android:name="net.nyist.lenovo.fragmenttest.RightFragment"    android:layout_width="0dp"    android:layout_height="match_parent"    android:layout_weight="3"/></LinearLayout>

可以看到,layout/activity_main布局只包含了一个碎片,即单页模式,而layout-large/activity_main布局包含了两个碎片,即双页模式。其中large就是一个限定符,哪些屏幕被认定为是large的设备就会自动加载layout-large文件夹下的布局,而小屏幕的设备则还是会加载layout文件夹下的布局。
双页模式
然后将MainActivity中replaceFragment()方法里的代码注释掉,重新运行。

单页模式运算效果:
单页模式

android中一些常见的限定符可以参考下表:

限定符

例如,在一般情况下我们都是在layout文件夹下为某个活动准备一个默认的布局文件,而在大屏幕设备上,这个布局文件可能就不怎么适用了。因此,我们可以利用限定符large,在res目录下新建一个layout_large文件夹,再新建一个同名的布局文件。
这样,当程序运行在了大屏幕设备上时,android就会自动地加载layout_large文件夹下的布局文件,其他情况下还是会加载layout文件下的布局文件。这样,当程序运行在不同屏幕大小的手机上时都可以有比较完美的布局了。
只是,有时候我们也不希望由系统来为我们来判断加载哪个布局,而是希望能够为之设定一个临界值,当屏幕宽度小于临界值时,加载默认布局,当大于时则加载另一个专门准备的布局文件。
可以在res目录下新建一个文件夹,命名为layout_ sw650dp,再将专门准备的同名布局文件放置在其中。这样,当程序运行在屏幕大于650dp的设备上时,就会加载layout_ sw650dp文件夹下的布局文件了。

原创粉丝点击