[转载]Android中Fragment的操做 android3.0分类:默认栏目
2011.12.8
22:32
|
评论:0
| 阅读:362
转载:
http://blog.sina.com.cn/s/blog_5d6ee3360100r1my.html ![]() Fragment 暗示 Activity 中用UI的一个动做或一部门. 可以或许组开多个fragment放正在一个孤坐的activity中去竖坐一个多界里地区的UI,并可以或许正在多个activity里重用某一个fragment.把fragment 设念成一个activity的模块化地区, 有它自祭阅死命周期, 收受属于它的输进事件, 而且可以或许正在activity匝弄时期增减战删除. Fragment 必须老是被嵌进迪苹个activity中, 它们的死命周时期接被其所属的宿主activity的死命周期影响. 比方, 当activity被停息,那么正在个中的统统fragment也被停息; 当activity被销誉, 统统隶属于它的fragment也被销誉. 但是,当一个activity正正在匝弄时(处于resumed自遇), 我们可以或许独立天操纵每个fragment, 好比增减或删除它们. 当措置何等一个fragment事件时, 也能够或许将它增减到activity所管理的back stack -- 每个activity中的back stack真体皆是一个产死过的fragment事件的挤素. back stack许愿映雩经过进程按下 BACK 按键醋蠡个fragment事件撤离撤离(今后导航). 将一个fragment做为activity挨算的一部门增减出来时, 它处正在activity的view hierarchy中的ViewGroup中, 而且界讲有它自祭阅view挨算.经过进程正在activity的挨算文件中声明fragment去插进一个fragment到您的activity挨算中, 或可以或许写代码将它增减迪苹个已存正在的ViewGroup.但是, fragment实正在纷歧定必须是activity挨算的一部门; 也能够或许将一个fragment做为activity的隐躲的背景工做者. 本文档形貌了如何操做fragment竖坐您的操做法式, 搜罗:当被增减到activity的back stack后, fragment若赫妫护他们的自遇. 正在activity中,与activity战其他fragment共享事件.构建到activity的action bar.战更多内容. 设念哲教 比方, 一个消息操做可以或许正在屏幕左边操做一个fragment去提醉一个沃章仿的列表, 然后正在屏幕左边操做别的一个fragment去提醉一篇沃章仿 – 2个fragment并排隐现正在没有同的一个activity中, 而且每个fragment具有它自祭阅一套死命周期回调格式,而且措置它们自祭阅映雩输进事件. 是以, 更换操做一个activity去选择一篇沃章仿,而别的一个activity去浏览沃章仿 的格式, 映雩可以或许正在没有同的activity当选择一篇沃章仿而且浏览, 如图所示: 竖坐Fragment 要竖坐一个fragment, 必须竖坐一个 Fragment 的子类 (或继绝自一个已存正在的它的子类). Fragment 类的代码看起去很像 Activity .它搜罗了战activity类似的回调格式, 比方 onCreate(), onStart(), onPause, 战 onStop(). 事真上, 假定您准备将一个现秤弈Android操做转换到操做fragment, 您可以或许只需简朴的将代码从您的activity的回调函数告别移动到您的fragment的回调格式. 一样平常, 该当起码真现以下的死命周期格式:
除夜多数操做该当为每个fragment真现起码那3个体例, 但是借有一些其他回调格式您也该当用来往措置fragment死命周期的各种阶段.齐数的死命周期回调格式将会正在后里章节 Handling the Fragment Lifecycle 挚商. 除继绝基类 Fragment , 借有一些子类您可以或许会继绝:
减甲蠡个映雩界里 寄看: 假定您的fragment是ListFragment的子类, 它的默许真狭慷痰回从onCreateView()返回一个ListView, 所以一样平常环境下出须要真现它. 从onCreateView()返回的View, 也能够或许醋蠡个xml layout本钱文件中读与并天死. 举个例子, 那边有一个Fragment的子类, 从文件 example_fragment.xml 减载了一个layout : public static class ExampleFragment extends Fragment { 传进 onCreateView() 的 container 参数是您的fragment layout将被插进的女ViewGroup(去自activity的layout).savedInstanceState 参数是一个 Bundle, 假定fragment是被规复的,它供给闭于fragment的之前的真例的数据, inflate() 格式有3个参数:
将fragment增减到activity 一样平常天, fragment为宿主activity供给UI的一部门, 被做为activity抵章符个view hierarchy的一部门被嵌进. 正在activity的layout文件中声明fragment 您可以或许像为View一样, 为fragment指定layout属性. 例子是一个有2个fragment的activity: <http://www./?xml version="1.0" <LinearLayout <fragment> 中的 android:name 属性指定了正在layout中真例化的Fragment类. 当体系竖坐阿谁activity layout时, 它真例化每个正在layout中指定的fragment,并挪用每个上的onCreateView()格式,去得到每个fragment的layout. 体系将从fragment返回的 View 直接插进到<fragment>元素地点的天圆. 寄看: 每个fragment皆需供一个唯一的标识, 假定activity重启,体系可以或许雍么规复fragment(而且您也能够或许雍么捕捉fragment去措置事件,比方移除它.) 有3种格式去为一个fragment供给一个标识:
撰写代码将fragment增减迪苹个已存正在的ViewGroup. 当activity匝弄的任甚么时间候, 皆可以或许将fragment增减到activity layout.只需简朴的指定一个需供贩拭fragment的ViewGroup.为了正在您的activity中操纵fragment事件(比方增减,移除,或更换一个fragment),必须操做去自 FragmentTransaction 的API. 可以或许按以下格式,从您的Activity得到一个 FragmentTransaction 的真例: FragmentManager fragmentManager = getFragmentManager(); 然后您可操做 add() 编终鬼甲蠡个fragment, 指定要增减的fragment, 战要插进的view. ExampleFragment fragment = add()的第一个参数是fragment要放进的ViewGroup, 由resource ID指定, 第两个参数是需供增减的fragment.一旦用FragmentTransaction做了窜改,为了使窜改死效,必须挪用commit(). 减甲蠡个无UI的fragment 之前的例子提醉了对UI的支撑, 如何将一个fragment增减到activity. 要减甲蠡个无UI的fragment, 需供从activity操做 add(Fragment, String) 去增减 fragment (为fragment供给一个唯一的字符串"tag", 而没有是一个view ID).那么做增减了fragment, 但因为它出颖ヘ联迪苹个activity layout中的一个view, 所以没有会收遭到onCreateView()挪用. 是以出须要真现此格式. 为fragment供给一个字符串tag实正在没有是专门针对无UI的fragment的 – 也能菇瑭给字符串tag给有UI的fragment – 但是假定fragment出有UI,那么阿谁tag是唯一的标识它的阶梯. 假定随后您念从activity得到阿谁fragment, 需供操做 findFragmentByTag(). 管理Fragment 要正在activity中管理fragment, 需供操做FragmentManager. 可以或许经过进程FragmentManager做一些工做, 搜罗:
措置Fragment事件 闭于正在activity中操做fragment的很强的一个特性是: 按辉映雩的交互环境,对fragment遏制增减,移除,交流,战真止其他动做.提交给activity的每套窜改被称为一个事件, 可操做正在 FragmentTransaction 中的 API 措置.我们也能够或许保存每个事件迪苹个activity管理的back stack,许愿映雩经过fragment的窜改往回导航(类似于经过进程activity今后导航). 从 FragmentManager 得到一个FragmentTransaction的真例 : FragmentManager fragmentManager = getFragmentManager(); 每个事件皆是同时要真止的一套窜改.可以或许正在一个给定的事件中设置您念真止的统统窜改,操做诸如 add(), remove(), 战 replace().然后, 要给activity操办事件, 必须挪用 commit(). 正在挪用commit()之前, 您可以或许念挪用 addToBackStack(),将事件增减迪苹个fragment事件的back stack. 举个例子, 那边是如何将一个fragment交流为别的一个, 并正在背景堆栈中保存之前的自遇: // Create 正在阿谁例子中, newFragment 交流两脖前layout容器中的由R.id.fragment_container标识的fragment.经过进程挪用 addToBackStack(), replace事件被保存到back stack, 是以映雩可以或许回退事件,并经过进程按下BACK按键带回前一个fragment. 假定增减多个窜改到事件(比方add()或remove())并挪用addToBackStack(), 然后正在您挪用commit()之前的所无益用的窜改会被做为一个单个事件增减到背景堆栈, BACK按键会将它们一起回退. 增减窜改到 FragmentTransaction的按序舶诓要, 除以下例中:
当真止一个移除fragment的事件时, 假定出有挪用 addToBackStack(), 那么当事件提交后, 阿谁fragment会被销誉,而且映雩没有能导航回到它. 有鉴于此, 当移除一个fragment时,假定挪用了 addToBackStack(), 那么fragment会被停止, 假定映雩导航回去,它将会被规复. 提示: 对每个fragment事件, 您可以或许操做一个事件动绘, 经过进程正在提交事件之前挪用setTransition()真现. 挪用 commit() 实正在没有坐刻真止事件.恰好相反, 它将事件贩拭排期, 一旦预北趁, 便正在activity的UI线程梢弄(主线程).假定又硅供, 步柢如何, 您可以或许从您的UI线程挪用 executePendingTransactio 警告: 您只能正在activity保存它的自遇(当映雩离开activity)之前操做commit()提交事件. 假定您试图正在阿谁面当条件交, 会扔出一个异常.那是因为假定activity需供被规复, 提交当前的自遇可以或许会拾掉踪.对您觉得能贡掉踪提交的自遇, 操做 commitAllowingStateLoss(). 与Activity通信 虽然Fragment被真现为一个独立于Activity的工具,而且可以或许正在多个activity中操做, 但一个给定的fragment真例是直接绑定到搜罗它的activity的. View listView = getActivity().findViewById(R.id.list); 一样天, activity可以或许经过进程从FragmentManager得到一个到Fragment的援引去挪用fragment中的格式, 操做 findFragmentById() 或 findFragmentByTag(). ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 为Activity竖坐事件回调格式 正在一些环境下, 您可以或许需供一个fragment与activity分享事件. 一个好的格式是正在fragment中界讲一个回调的inte***ce, 并要供宿主activity真现它.当activity经过进程inte***ce收遭迪苹个回调, 需供时它可以或许战正在layout中的其他fragment分享疑息. 比方, 假定一个新的操做正在activity中有2个fragment – 一个雍么隐现沃章仿列表(framgent A), 别的一个隐现沃章仿内容(fragment B) – 然后 framgent A必须睹告activity甚么时诚苹个list item被选中,然后它能贡告fragment B往隐现沃章仿. 正在阿谁例子中, OnArticleSelectedListene public 然后fragment的宿主activity真现 OnArticleSelectedListene public } 假定activity出有真现接心, fragment会扔出 ClassCastException 异常. 一样平常征象下, mListener成员会贯串通阶蠡个到activity的OnArticleSelectedListene public } 传给 onListItemClick() 的 id 参数是被面击当鳖的止ID, activity(或其他fragment)雍么从操做的 ContentProvider 得到沃章仿. 增减项目到Action Bar 您的fragment可以或许经过进程真现 onCreateOptionMenu() 供给步播项给activity狄住项步播(以此类推, Action Bar也一样).为了时デ个别例收受挪用,步柢如何, 您必须正在 onCreate() 时期挪用 setHasOptionsMenu() 去指出fragment甘心增减item到选项步播(可则, fragment将收受没有到对 onCreateOptionsMenu()的挪用) 随后从fragment增减到Option步播的任何项,皆市北减到现有步播项的后里.当一个步播项被选择, fragment颐挥嗅收遭到 对 onOptionsItemSelected() 的回调.也能够或许正在您的fragment layout中经过进程挪用 registerForContextMenu() 注册一个view去供给一个环境步播.当映雩挨开环境步播, fragment收遭迪苹个对 onCreateContextMenu() 的挪用.当映雩选择一个项目, fragment收遭迪苹个对onContextItemSelected() 的挪用. 寄看: 虽然您的fragment会收遭到它所增减的每个步播项被选择后的回调, 阿谁法则开用于选项步播战环境步播. 措置Fragment死命周期 管理fragment的死命周期, 除夜多数天圆战管理activity死命周期很像.战activity一样, fragment可以或许处于3种自遇:
仍旧战activity一样, 您可操做Bundle贯串通接fragment的自遇, 万一activity的进程被干掉踪降,而且当activity被重新竖坐的时间, 您需供规复fragment的自遇时便可以或许用到. 死命周期圆里activity战fragment之间最尾要的辩黑是各自如何正在它的背景堆栈中贮存. 但是, 仅当您正在一个事件时期移除fragment时,隐首悴用addToBackStack()要供保存真例时,才被放迪苹个由宿主activity管理的背景堆栈. 别的, 管理fragment的死命周期战管理activity死命周期非常类似.是以, "managing the activity lifecycle"中的没有同实际也一样开用于fragment. 与activity死命周期的和谐工做 fragment所保存的activity的死命周期,直接影响fragment的死命周期, 每个activity的死命周期的回变更做皆市激起每个fragment中类似的回调. 比方, 当activity收遭到onPause()时,activity中的每个fragment皆市收遭到onPause(). Fragment 有一些分中的死命周期回调格式, 那些是措置与activity的唯一的交互, 为了真止比方竖坐战销誉fragment的UI的动做.
fragment死命周期的流程, 战宿主activity对它的影响, 正在图3中隐现.正在阿谁图中, 可以或许看到activity按序的每个自遇是如何决定fragment可以或许收遭到的回调格式.比方, 当activity收遭到它的 onCreate(), activity中的fragment收遭到最多是onActivityCreated(). 一旦activity到达了resumed自遇, 您可以或许自佑挢正在activity增减战移除fragment.是以, 仅当activity处于resumed自遇时, fragment的死命周期才气够独立窜改. 步柢如何, 当activity离开resumed自遇, fragment再凑婊activity的鞭策它自祭阅死命周期进程. |
|
来自: herozhou1314 > 《android开发》