当前位置: 移动技术网 > IT编程>移动开发>Android > 学习安卓开发[2] - 在Activity中托管Fragment

学习安卓开发[2] - 在Activity中托管Fragment

2018年11月12日  | 移动技术网IT编程  | 我要评论

芮成钢专访朴槿惠,香港洗发水,知了图片

目录

在上一篇学习安卓开发[1]-程序结构、activity生命周期及页面通信中,学习了activity的一些基础应用,基于这些知识,可以构建一些简单的app了,但这还远远不够,本节会学习如何使用activity托管fragment的方式来进行开发

为什么需要fragment

单纯使用activity的局限

为什么需要fragment呢,这要从activity的局限说起。在前面使用activity的过程中已经发现,activity很容易被销毁重建,甚至是在设备旋转的时候也会被销毁,为了返回之前的状态需要保存各种界面相关的信息。
再来假设一种比较常见的场景,一个列表界面+明细界面构成的应用,如果用两个activity来实现也可以,但如果用户在平板设备上运行应用,则最好能同时显示列表和明细记录,类似网易云、qq那样在屏幕左侧约1/3的区域显示列表,右侧剩余的区域展示详细信息,这是使用两个activity无法满足的;另外,查看能否在用户想查看下一条明细时不必回退、再点击进入明细界面,而是采用在屏幕横向滑动切换到下一条这样的快捷手势呢,这也是两个activity无法满足的。

fragment介绍

接下来该是fragment隆重登场的时候了,可以说fragment就是为了应对ui的灵活需求而生的,fragment是在api 11中开始引入的,当时google发布了第一台平板设备。
那么什么是fragment呢,fragment是一种控制器对象,可以在activity的托管下进行用户界面的管理,受其管理的界面可以是整个屏幕区域,也可以是一小部分,fragment(碎片)就是这个意思。
要让activity能够托管fragment,则需要activity视图预留fragment插入其中的位置。一个activity视图中可以插入过个fragment视图。fragment本身没有在屏幕上显示视图的能力,所以它必须放置在activity的视图层级中。

如何使用fragment

代码实现
容器视图和activity

在文件activity_fragment.xml中定义容器视图:

<framelayout android:id="@+id/fragment_container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在activity中定义了一个用于放置fragment的framelayout,这个容器视图可以托管任意的fragment。
对应activity的代码在crimeactivity.java为:

@override
protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_fragment);

    fragmentmanager fm = getsupportfragmentmanager();
    fragment fragment = fm.findfragmentbyid(r.id.fragment_container);
    if (fragment == null) {
        fragment = new crimefragment();
        fm.begintransaction()
                .add(r.id.fragment_container, fragment)
                .commit();
    }
}
fragmentmanager

这段代码的作用是:在资源id为r.id.fragment_container的framelayout容器中,找到fragment,然后判断获取的fragment是否为空,如果为空则创建新的名为crimefragment的fragment实例,将其添加到fragmentmanager所维护的队列中,并在容器r.id.fragment_container中显示。
除了这种用代码将fragment交给activity托管的方式,还可以在xml中直接将fragment签入activity,但为了能够动态地更换fragment,唯一能采用的便是前面采用的代码的方式。
在设备旋转或回收内存时,android系统会销毁activity,但fragmentmanager会将fragment队列保存下来。activity被重建时,新的fragmentmanager会首先获取保存的队列(这就是使用了fragment后,不会有像之前那样旋转就会设备导致状态丢失的现象的原因)。所以代码里会先判断fragment是否为null,只有为null的时候才会重新向队列中添加fragment。

fragment的生命周期

fragment的生命周期如下图所示:

可见fragment的生命周期与activity的生命周期非常类似,实际上fragment的许多方法对应着activity的生命周期方法。
fragment的oncreate方法:

@override
public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    ...
}

activity的oncreate方法:

@override
protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    ...
}

两者的区别在于fragment.oncreate()是公共方法,而activity.oncreate()是受保护方法,activity的生命周期方法由操作系统调用,而fragment的生命周期方法则是由托管它的activity调用的。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网