Android初级基础知识复习(十三) —— 碎片Fragment

静态注册

Fragment是个特别的存在,有点像报纸上的专栏,看起来只占据页面的一小块,但是这一小块有自己的生命周期,可以自行其事,仿佛独立王国;并且这一小块的特性无论在哪个页面,给一个位置就行,添 加后不影响宿主页面的其他区域,去除后也不影响宿主页面的其他区域。

每个Fragment都有对应的布局文件,依据其使用方式可分为静态注册动态注册两类。静态注册是在布局文件中直接放置fragment节点,类似于一个普通控件,可被多个布局文件同时引用。静态注册一般用于某个通用的页面部件(如Logo条、广告条等),每个活动页面均可直接引用该部件。

使用静态注册需要注意以下两点:
(1)fragment节点必须指定id属性,否则App运行时会报错Must specify unique android:id,android:tag, or have a parent with an id for 。
(2)如果页面代码继承自Activity,Fragment类就必须继承自android.app.Fragment,不能使用 android.support.v4.app.Fragment,否则App运行会报错Trying to instantiate a class that is not a Fragment或报 错java.lang.ClassCastException: cannot be cast to android.app.Fragment;如果页面代码继承自 AppCompatActivity或FragmentActivity,那么无论是android.app.Fragment还是android.support.v4.app.Fragment 都可以使用。

另外,介绍一下Fragment在静态注册时的生命周期,如Activity的基本生命周期方法onCreate、onStart、 onResume、onPause、onStop、onDestroy,碎片Fragment都有,而且还多出了下面5个生命周期方法。

  1. onAttach:与Activity结合。可在该方法中实例化Activity的一个回调对象,在Fragment中调用Activity 的回调方法。这样设计的好处是Activity无须调用setListener方法设置监听器接口*。
  2. onCreateView:创建碎片视图
  3. onActivityCreated:在活动页面创建完毕后调用
  4. onDestroyView:回收碎片视图。
  5. onDetach:与Activity分离

至于这些周期方法的先后调用顺序,观察日志最简单明了。下面是打开页面时的日志信息,此时 Fragment的onCreate操作先于Activity,而onStart与onResume操作在Activity之后。

12:26:11.506:D/StaticFragment(5809):onAttach
12:26:11.506:D/StaticFragment(5809):onCreate
12:26:11.530:D/StaticFragment(5809):onCreateView
12:26:11.530:D/FragmentStaticActivity(5809):onCreate
12:26:11.530:D/StaticFragment(5809):onActivityCreated
12:26:11.530:D/FragmentStaticActivity(5809):onStart
12:26:11.530:D/StaticFragment(5809):onStart
12:26:11.530:D/FragmentStaticActivity(5809):onResume
12:26:11.530:D/StaticFragment(5809):onResume

下面是退出页面时的日志信息,此时Fragment的onPause、onStop、onDestroy都在Activity之前。
12:26:36.586:D/StaticFragment(5809):onPause
12:26:36.586:D/FragmentStaticActivity(5809):onPause
12:26:36.990:D/StaticFragment(5809):onStop
12:26:36.990:D/FragmentStaticActivity(5809):onStop
12:26:36.990:D/StaticFragment(5809):onDestroyView
12:26:36.990:D/StaticFragment(5809):onDestroy
12:26:36.990:D/StaticFragment(5809):onDetach
12:26:36.990:D/FragmentStaticActivity(5809):onDestroy

总结一下,在静态注册时,除了碎片的创建操作在页面创建之前,其他操作都在页面创建之后。

动态注册/碎片适配器FragmentStatePagerAdapter

Fragment拥有两种使用方式,即静态注册和动态注册。相比静态注册,实际开发中动态注册用得更 多。静态注册在布局文件中直接指定Fragment,而动态注册直到在代码中才动态添加Fragment。动态生成的 碎片给谁用、要怎么用呢?毫无疑问,动态碎片就是给翻页视图用的,ViewPager和Fragment是一对好搭档。

怎么在ViewPager中使用Fragment,关键在于适配器。上一节演示ViewPager时用的适配器是翻页适配器 PagerAdapter。如果结合Fragment,适配器就要改用碎片适配器FragmentStatePagerAdapter

现在有了适用于动态注册的适配器与碎片对象,还需要一个主页面配合才能完成整个页面的展示。注意这里不能继承Activity,只能继承AppCompatActivity或 FragmentActivity。

下面来看Fragment的生命周期。惯例先输出代码加上生命周期的日志,然后观察动态注册的运行日志。

下面是打开页面时的日志信息:
12:28:28.074:D/FragmentDynamicActivity(5809):onCreate
12:28:28.074:D/FragmentDynamicActivity(5809):onStart
12:28:28.074:D/FragmentDynamicActivity(5809):onResume
12:28:28.086:D/DynamicFragment(5809):onAttach position=0
12:28:28.086:D/DynamicFragment(5809):onCreate position=0
12:28:28.114:D/DynamicFragment(5809):onCreateView position=0
12:28:28.114:D/DynamicFragment(5809):onActivityCreated position=0
12:28:28.114:D/DynamicFragment(5809):onStart position=0
12:28:28.114:D/DynamicFragment(5809):onResume position=0
12:28:28.114:D/DynamicFragment(5809):onAttach position=0
12:28:28.114:D/DynamicFragment(5809):onCreate position=0
12:28:28.146:D/DynamicFragment(5809):onCreateView position=1
12:28:28.146:D/DynamicFragment(5809):onStart position=1
12:28:28.146:D/DynamicFragment(5809):onResume position=1

下面是退出页面时的日志信息:
12:28:57.994:D/DynamicFragment(5809):onPause position=0
12:28:57.994:D/DynamicFragment(5809):onPause position=1
12:28:57.994:D/FragmentDynamicActivity(5809):onPause
12:28:58.402:D/DynamicFragment(5809):onStop position=0
12:28:58.402:D/DynamicFragment(5809):onStop position=1
12:28:58.402:D/FragmentDynamicActivity(5809):onStop
12:28:58.402:D/DynamicFragment(5809):onDestroyView position=0
12:28:58.402:D/DynamicFragment(5809):onDestroy position=0
12:28:58.402:D/DynamicFragment(5809):onDetach position=0
12:28:58.402:D/DynamicFragment(5809):onDestroyView position=1
12:28:58.402:D/DynamicFragment(5809):onDestroy position=1
12:28:58.402:D/DynamicFragment(5809):onDetach position=1
12:28:58.402:D/FragmentDynamicActivity(5809):onDestroy

日志搜集完毕,接下来分析一下这其中的奥妙。笔者总结了一下,主要有以下三点:
(1)动态注册时,Fragment的onCreate操作在Activity之后,其余操作的先后顺序与静态注册时保持一致。
(2)注意onActivityCreated方法。无论是静态注册还是动态注册,该方法都在Activity的onCreate操作之后。可见该方法在页面创建之后才调用。
(3)最重要的一点,进入第一个Fragment,实际只加载了第一页和第二页,并没有加载全部 Fragment。这正是Fragment的优越之处,无论当前位于哪一页,系统都只会加载当前页及相邻的前后两页, 总共加载不超过三页。一旦发生页面切换,相邻页面就被加载,非相邻页面就被回收。这么做的好处是节省了宝贵的系统资源,只有用户正在浏览与将要浏览的Fragment才会加载,避免所有Fragment一起加载造成资源浪费,这正是普通ViewPager的缺点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值