资讯专栏INFORMATION COLUMN

学习安卓开发[2]

Forelax / 2797人阅读

摘要:目录在上一篇学习安卓开发程序结构生命周期及页面通信中,学习了的一些基础应用,基于这些知识,可以构建一些简单的了,但这还远远不够,本节会学习如何使用托管的方式来进行开发为什么需要单纯使用的局限为什么需要呢,这要从的局限说起。

目录

在上一篇学习安卓开发[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中定义容器视图:

在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调用的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/2623.html

相关文章

  • 安卓开发文档学习笔记之ActionBar的使用与适配

    摘要:自从把加入到后,其在安卓布局中的地位便一路上升。通过安卓的官方文档可以看出,的出现旨在为用户提供一个更加简洁和友好的框架。同时开发者通过采用也可以获得诸多好处比如在高版本安卓系统中更好的稳定性。 ActionBar 自从Android3.0(API 11)把ActionBar加入到android sdk后,其在安卓UI布局中的地位便一路上升。通过安卓的官方文档可以看出,ActionB...

    Towers 评论0 收藏0
  • 华为鸿蒙OS发布!方舟支持混合编译,终将可替换安卓

    摘要:华为官方表示,鸿蒙将向全球开发者开源,并推动成立开源基金会,建立开源社区。华为表示将会依托中国来打造鸿蒙生态。根据华为公布数据显示年手机出货量亿台。截至今年月日,年华为手机发货量突破亿台。如华为将在本月正式发售。 前言 有关于鸿蒙的消息之前也有说过,就在昨天下午,华为举行了2019开发大会,正式推出了鸿蒙os系统(Harmony)。其相关负责人表示,也是基于微软内核的全场景分布式OS ...

    snifes 评论0 收藏0
  • 安卓开发学习笔记(三):Android Stuidio无法引用Intent来创建对象,出现canno

    笔者在进行安卓开发时,发现自己的代码语法完全没有问题。尤其是创建intent对象的时候,语法完全是正确的,但是Android Stuidio却显示报错,Intent类显示为红色,如图所示: 代码如下所示: 1 Button button2=(Button)findViewById(R.id.button_2); 2 button2.setOnClick...

    番茄西红柿 评论0 收藏0
  • 鸿蒙学习笔记之初识鸿蒙

    摘要:鸿蒙系统鸿蒙系统中的方舟编译解决了这个问题。鸿蒙并不是安卓的套壳。鸿蒙鸿蒙分布式软总线以为核心的应用开框架连接设备的对比安卓系统发现配对链接组合验证鸿蒙系统从使用的角度来讲,不管多少设备连在一起,鸿蒙都能像使用一台设备那样简单。 1.什么是鸿蒙? 1.移动通讯发展史   1.1G时代(语音...

    liujs 评论0 收藏0
  • 学习安卓开发[3]

    摘要:在上一篇学习安卓开发在中托管中了解了使用的好处和方法,本次记录的是在进行列表展示时的使用。的作用的是按需创建对象,当被滑动到屏幕外后,便会将其回收再利用。基本的使用方式如下,其中为单个列表项的名称。在上一篇学习安卓开发[2] - 在Activity中托管Fragment中了解了使用Fragment的好处和方法,本次记录的是在进行列表展示时RecyclerView的使用。 RecyclerV...

    xingqiba 评论0 收藏0

发表评论

0条评论

Forelax

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<