#Fragment基础及注意点

引言


A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and which you can add or remove while the activity is running (sort of like a "sub activity" that you can reuse in different activities).

一个碎片代表在时间中的一种行为或者一部分的用户交互,你可以在一个单一的活动(activity)中,组合复杂的碎片形成一个复合UI,并可以重复使用碎片在多个活动中.你可以将碎片想象成活动的一个组件,它有自己的生命周期,获得到它自己的输入事件,并且你可以添加或者移除碎片当活动正在运行(有些类似活动的下级,可以在不同的活动中进行重复使用).

生命周期


fragment有它自己的生命周期,所以我们先来分析下生命周期.

fragment_lifecycle.png
  • onAttach(Activity)

    called once the fragment is associated with its activity.

    当fragment和activity建立关系的时候调用

  • onCreate(Bundle)

    called to do initial creation of the fragment.

    调用初始化创建fragment

  • onCreateView(LayoutInflater, ViewGroup, Bundle)

    creates and returns the view hierarchy associated with the fragment.

    创建和返回与fragment相关的布局。

  • onActivityCreated(Bundle)

    tells the fragment that its activity has completed its own Activity.onCreate().

    告知fragment activity已经完成它的生命周期中onCreate这一步。

  • onViewStateRestored(Bundle)

    tells the fragment that all of the saved state of its view hierarchy has been restored.

    告知fragment 布局的所有存储状态都已经恢复。即这里就是取出存储到Bundle中的数据.

  • onStart()

    makes the fragment visible to the user (based on its containing activity being started).

    使得fragment对于用户可见(这是基于包含碎片的activity可见的情况下).在这种情况下用户只能看到视图,但是不能进行交互。

  • onResume()

    makes the fragment begin interacting with the user (based on its containing activity being resumed).

    使得碎片开始和用户进行交互(基于包含碎片的activity也开始交互的情况下)

  • onPause()

    fragment is no longer interacting with the user either because its activity is being paused or a fragment operation is modifying it in the activity.

    碎片不再和用户交互,可能是activity进入paused状态(activity进入半透明,半遮盖的状态),或者碎片被移除或者替代。

  • onStop()

    fragment is no longer visible to the user either because its activity is being stopped or a fragment operation is modifying it in the activity.

    碎片不再对用户可见,因为activity进stopped状态(activity对用户也不可见),或者fragment被移除在当前activity中。

  • onDestroyView()

    allows the fragment to clean up resources associated with its View.

    fragment清除和视图有关的资源。

  • onDestroy()

    called to do final cleanup of the fragment's state.

    对碎片状态的最后清理。

  • onDetach()

    called immediately prior to the fragment no longer being associated with its activity.

    通知fragment和当前activity解除关系。

  • 大致分为以下过程:

    1. 创建过程:onAttach->onCreate->onCreateView->onActivityCreated
    2. 可见化过程:onStart->onResume
    3. 后台过程:onPause->onStop
    4. 销毁过程:onDestoryView->onDestory->onDetach

按照生命周期的顺序执行。

注意:如上图生命周期图,用户将程序放在后台运行或者进入堆栈,切换到其他视图,就会执行onPause->onStop.这两个操作就是针对可视化到不可视化做出的响应。

Back Stack


关于fragment的回退栈可以看我的这篇文章.

状态的恢复和存储


方法

  • onSaveInstanceState(Bundle outState)

    这是用来储存状态的,比如成员变量等等,但是不需要手动存储视图数据,因为android机制中View自动存储恢复,如果你只想恢复视图只需要实现这个方法。
  • onActivityCreated(Bundle)

首先我们要知道fragment中没有和activity 一样的onRestoreInstanceState方法进行状态恢复,所以我们一般在onActivityCreated进行状态恢复,当然onCreate(),onCreateView都可以。

onSaveInstanceState调用:

  • This corresponds to Activity.onSaveInstanceState(Bundle) and most of the discussion there applies here as well. Note however: this method may be called at any time before onDestroy(). There are many situations where a fragment may be mostly torn down (such as when placed on the back stack with no UI showing), but its state will not be saved until its owning activity actually needs to save its state.

  • 和activity的onSaveInstanceState(Bundle)相当。这个方法可能被调用在onDestory()之前的许多时机,例如进入后台,但是只有当activity真的需要保存状态的时候才会调用。

  • 也就是说当进入后台过程(onPause->onStop->onDestoryView),都有可能调用onSaveInstanceState保存状态,但是只有真的需要保存状态的时候才会调用。我们来列举下不需要调用的情况:

    1. fragmentB返回A,此时不会调用B的onSaveInstanceState方法,因为B不需要被恢复。
    2. 当B在A之后被创建,如果在B的生存期间A并没有被销毁的话,那么系统可能并不会调用A的onSaveInstanceState方法,因为这个时候的A仍然是完整的。
  • 当然在旋转和跳转的时候都会进行调用。

注意点:onSaveInstanceState中你只需要保存一些变量,即状态的保存。不需要存储视图资源,因为android View中已经自动实现了存储恢复机制,你只需要声明了onSaveInstanceState方法,View会自动在需要的时候进行存储和恢复。

getChildFragmentManager


  • fragment中用getChildFragmentManager来管理fragment所嵌套的fragment。
  • 所以对fragment进行管理有两种,一种是在activity中对fragment进行管理,一种是在fragment中管理嵌套的fragment.

总结


  • fragment几个重要概念:生命周期,堆栈管理,存储恢复。
  • 多实践,理解会更加深刻。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容