Android学习笔记:碎片(Fragment)

一、概念

(1)Fragment是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间。
(2)一般建议使用support-v4库中的Fragment,因为它可以让碎片在所有Android系统版本中保持功能一致。
(3)通过LayoutInflater的inflate()方法加载fragment布局。
(4)Fragment必须被嵌入一个Activity中,它们的生命周期直接受宿主Activity的影响。
(5)当一个Activity正在运行时,可以独立地操作其中的每一个Fragment,如添加或删除。

注:Fragment的特点
Fragment的设计主要是把Activity界面包括其逻辑打碎成很多个独立的模块,这样便于模块的重用和更灵活地组装,呈现出多样的界面。
(1)Fragment可以作为Activity界面的一个部分组成。
(2)可以在一个Activity里面出现多个Fragment,并且一个Fragment可以在多个Activity中使用。
(3)在Activity运行中,可以动态地添加、删除、替换Fragment。
(4)Fragment有自己的生命周期的,可以响应输入事件。

二、静态加载碎片

静态加载只需要把Fragment当成普通的UI控件放到界面Layout中。

三、动态加载碎片

动态加载碎片的步骤:

  • ①创建待添加的碎片实例;
  • ②获取FragmentManager,在活动中可以直接通过调用getSupportFragmentManager()方法得到;
  • ③开启一个事务,通过调用beginTransaction()方法开启;
  • ④向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例;
  • ⑤提交事务,调用commit()方法来完成;
   //获取FragmentManager
   FragmentManager fragmentManager = getSupportFragmentManager();
   //开启一个事务
   FragmentTransaction transaction = fragmentManager.beginTransaction();
   //添加/替换碎片(R.id.XXX_layout表示容器的id,xxx表示待添加的碎片实例)
   transaction.replace(R.id.XXX_layout, xxx);
   //提交事务
   transaction.commit();

注:FragmentTransaction中提供了一个addToBackStack()方法,可以用于将一个事务添加到返回栈中。

四、碎片和活动之间的通信

1、在Activity中获取Fragment实例

若Activity中包含自己管理的Fragment引用,可以直接访问Fragment的公有方法进行相应操作。

若Activity中未保存Fragment的引用,则通过getFragmentManager().findFragmentBuTag()或者findFragmentById()获得相应Fragment实例,然后进行操作。

  • ①活动→findFragmentById()→碎片
  • ②FragmentManager提供了一个类似于findViewById()方法的findFragmentById()方法(专门用于从布局文件中获取碎片的实例),可以在活动中得到相应碎片的实例,然后就可以轻松调用碎片里的方法了。

2、在Fragment中获取Activity实例

在Fragment中可以通过getActivity()方法得到当前绑定的Activity实例,然后进行相应的操作。

注意:在Fragment中可以通过getActivity()方法来获取Context,若需要让Context在Activity被销毁后还存在,则可以用getActivity().getApplicationContext()来获取。

  • ①碎片→getActivity()→活动
  • ②在每个碎片中都可以通过getActivity()方法来得到和当前碎片相关联的活动实例。

五、碎片的状态

  • 1、运行状态:当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。
  • 2、暂停状态:当一个活动进入暂停状态时,与它相关联的可见碎片就会进入到暂停状态。
  • 3、停止状态:当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态,或者通过FragmentTransaction的remove()、replace()方法将碎片从活动中移除。
  • 4、销毁状态:碎片总是依附于活动的存在而存在,因此当活动被销毁时,与它相关联的碎片就会进入到销毁状态。

六、碎片的生命周期

Fragment生命周期 Fragment与Activity生命周期的对比
Android学习笔记:碎片(Fragment)_第1张图片 Android学习笔记:碎片(Fragment)_第2张图片
  • onAttach():当碎片和活动建立关联的时候调用
  • onCreate():当第一次创建碎片的时候调用
  • onCreateView():为碎片创建视图(加载布局)时调用
  • onActivityCreated():确保与碎片相关联的活动一定已经创建完毕的时候调用,也就是当Activity中的onCreate()方法执行完后调用
  • onStart():碎片从不可见变为可见时调用
  • onResume():碎片准备好与用户进行交互时调用
  • onPause():碎片处于暂停状态时调用
  • onStop():碎片处于停止状态时调用
  • onDestroyView():碎片中视图被移除时调用
  • onDestroy():碎片销毁之前调用
  • onDetach():当碎片和活动解除关系的时候调用
    注:在碎片中可以通过onSaveInstanceState()方法来保存数据,因为进入停止状态的碎片有可能在系统内存不足时被回收。保存下来的数据在onCreate()、onCreateView()和onActivityCreated()这3个方法中你都可以重新得到,它们都含有一个Bundle类型的savedInstanceState参数。

七、多Fragment切换

1、如何切换Fragment?

首先分别获取FragmentManager与FragmentTransaction的实例,然后创建一个Fragment实例,接下来调用FragmenTransaction对象的replace()方法与commit()方法来完成Fragment的切换。如下:

//获取FragmentManager实例
FragmentManager frgmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//创建一个Fragment
Fragment fragment = new Fragment();
fragmentTransaction.replace(R.id.content, fragment);
fragmentTransaction.commit();

2、切换优化

虽然上述方法可以切换Fragment,但是面对大量点击来回切换,或者本来就有非常多的Fragment,会导致OOM。

  • 1、预加载模式
    在加载第一个Fragment时就把全部Fragment加载好。下次直接调用。
  • 2、动态加载模式
    所有的Fragment只实例化一次,实例化的Fragment会被存入内存,下次切换会判断内存中是否含有要切换的Fragment,如果有就直接复用,没有就add一个新的。

你可能感兴趣的:(Android,Android,Android学习笔记)