android fragment实例怎样让fragment全屏

用心创造滤镜
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
河北保定人
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
<ol start="1"
style="margin-top: 0px !imp margin-bottom: 1px !imp margin-left: 45px !imp border: list-style-; list-style-image: background-color: rgb(255, 255, 255); color: rgb(92, 92, 92);"
><li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>public&void&onInflate(Activity&activity,&AttributeSet&attrs,Bundle&savedInstanceState)&{&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&if(savedInstanceState&!=&null){&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&&&&&showInfo("****&book&is&"&+&savedInstanceState.getString("Book"));&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&}&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&...&略&...&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&super.onInflate(activity,&attrs,&savedInstanceState);&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>}&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>public&void&onCreate(Bundle&bundle)&{&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&super.onCreate(bundle);&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&if(bundle&!=&null){&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&&&&&showInfo("****&book&is&"&+&bundle.getString("Book"));&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&}&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>}&&保留fragment实例在fragment的生命周期图中,有虚线的部分,从onDestroyView回到onCreateView状态,这是保留fragment实例,但测试场景,我没能找到进行验证。下面是保留fragment实例的实现方式:<div style="font-family: Consolas, 'Courier New', Courier, mono, font-size: 12 background-color: rgb(231, 229, 220); width: 936.5 overflow: padding-top: 1 margin: 18px 0px !imp line-height: 25"
>[java]&<ol start="1"
style="margin-top: 0px !imp margin-bottom: 1px !imp margin-left: 45px !imp border: list-style-; list-style-image: background-color: rgb(255, 255, 255); color: rgb(92, 92, 92);"
><li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>public&void&onCreate(Bundle&bundle)&{&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&super.onCreate(bundle);&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&setRetainInstance(true);//设置true,表明在存储中保留fragment对象。&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>}&&由于将返回onCreateView()状态,合适的设置位置在onCreate()中。这种情况要求fragment不在back stack中,尤其适合于没有UI的fragment,当activity被destroy并重建时,fragment仍在app中,其onDestroy()以及onCreate()并不会被调用,onDetach()和onAttach()、onActivityCreated()会被调用,因为需要关联到新的activity中。fragment切换效果利用fragment transaction进行切换,很方便提供切换的效果。利用setTransition()在中,介绍了如何在容器FrameLayout中通过fragment管理器,利用fragment transaction实现fragment切换的实现。通过setTransition()我们可以设置有限几个切换效果,代码如下:&&& protected void addFragmentToStack(int index){&&&&&&&&& DetailFragment detail = DetailFragment.newInstance(index);&&&&&&& FragmentTransaction ft = getFragmentManager().beginTransaction();&&&&&&&&&ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);&&&&&&&& ft.replace(R.id.details, detail);&&&&&&&&&&&&&&& ft.addToBackStack("detail");&&&&&&&& ft.commit();&&&& }代码设置的fade(渐变)效果。利用setCustomAnimations()通过ObjectAnimator自定义动态效果在res/animator中设置两个动态效果,slide_in_left.xml如下。&?xml version="1.0" encoding="utf-8"?&&&objectAnimator&xmlns:android="/apk/res/android"&&& android:interpolator="@android:interpolator/accelerate_decelerate"&&&& android:valueFrom="-1280"&&&& android:valueTo="0"&&&& android:valueType="floatType"&&&& android:propertyName="X"&&&& android:duration="2000"& /&实现自定义动画的类是ObjectAnimator,不仅用于fragment,也可用于view。在xml中,定义了从“from”状态到“to”状态,时间间隔为duration(毫秒),所执行的变化规则称为interpolator。最简单的interpolator是linear,即@android:interpolator/linear,从状态From到to状态是均匀变化。缺省的interpolator是accelerate_decelerate,如本例,在状态变化中先是加速,后是减速,使用户视觉上平滑过渡。此外还有@android:interpolator/bounce为弹跳方式。系统提供的方式可以在源代码/data/res/interpolator中查看。android:propertyName用于动画的维度,在本例中X表示横向,根view的setX()中的参数是float,所以设置valueType为floatType。我们设置可以设置自己的维度。From设置为-1280,因为这个值对于终端设备而言,-1280个像素位可以确保从不可视的位置移入。如果我们没有设置From,系统会根据当前值来设定初始值。另一个动态效果文件slide_out_right.xml如下:&?xml version="1.0" encoding="utf-8"?&&&objectAnimator&xmlns:android="/apk/res/android"&&& android:interpolator="@android:interpolator/accelerate_decelerate"&&&& android:valueFrom="0"&&&& android:valueTo="1280"&&&& android:valueType="floatType"&&&& android:propertyName="X"&&&& android:duration="2000" /&在看看其他动态效果。如要设置淡入淡出,维度是对象的透明度,即android:propertyName="alpha",淡入是from(0,不可视)到to(1),淡出是from(1)到to(0)。object animator会找到fragment的root view,然后不断地调用setAlpha()方法,来改变透明度,调用的频率和改变的值由interpolator来决定。如果我们要在两个或者两个以上的维度设置变化,可以使用set tag,对应为Android的AnimatorSet类,下面的例子同时设置向下和淡出效果。set有一个属性android:ordering,缺省为together,即各个维度的变化同时发生,还可以设置为sequentially依次发生。<div style="font-family: Consolas, 'Courier New', Courier, mono, font-size: 12 background-color: rgb(231, 229, 220); width: 936.5 overflow: padding-top: 1 margin: 18px 0px !imp line-height: 24"
>[html]&<ol start="1"
style="margin-top: 0px !imp margin-bottom: 1px !imp margin-left: 45px !imp border: list-style-; list-style-image: background-color: rgb(255, 255, 255); color: rgb(92, 92, 92);"
><li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&?xml&version="1.0"&encoding="utf-8"?&&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&set&xmlns:android="/apk/res/android"&&&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&&&&&&objectAnimator&android:interpolator="@android:interpolator/accelerate_cubic"&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&&&&&&&&&android:valueFrom="1"&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&&&&&&&&&android:valueTo="0"&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&&&&&&&&&android:valueType="floatType"&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&&&&&&&&&android:propertyName="alpha"&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&&&&&&&&&android:duration="1000"/&&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&&&&&&objectAnimator&android:interpolator="@android:interpolator/accelerate_cubic"&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&&&&&&&&&android:valueFrom="0"&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&&&&&&&&&android:valueTo="1280"&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&&&&&&&&&android:valueType="floatType"&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&&&&&&&&&&&&android:propertyName="Y"&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- background-color: rgb(248, 248, 248); line-height: 18"
>&&&&&&&&&&&&android:duration="1000"/&&&<li style="margin: 0px !imp padding: 0px 3px 0px 10px !imp border-style:
border-left-width: 3 border-left-color: rgb(108, 226, 108); list-style: decimal-leading- color: line-height: 18"
>&/set&&&程序代码的编写代码如下:protected void addFragmentToStack(int index){&&&&& DetailFragment detail = DetailFragment.newInstance(index);&&& FragmentTransaction ft = getFragmentManager().beginTransaction();&&&& //setCustomAnimations()必须位于replace()之前,否则效果不起所中。它的两个参数分别为enter,exit的效果。系统目前提供两个效果,分别为android.R.animator.fade_in和android.R.animator.fade_out&&&&ft.setCustomAnimations(R.animator.slide_in_left,R.animator.slide_out_right);&&&& ft.addToBackStack("detail");&&& ft.replace(R.id.details,"detail");&&&& ft.commit();&}&注意,进入和退出的两个操作是同时进行的,并非先执行完exit再执行enter。Transaction的一些操作Transaction提供add()、hide()、show()、remove()等功能。下面我们利用这些功能通过fragment的隐藏和显示,为用户提供切换的效果。public void showDetails(int index){&&&&& if(index &0)&&&&&&&& index = 0;&&&&&&&&&&&&//将所有书的简介都生成fragment,通过add()加入容器中&&&& FragmentTransaction ft = getFragmentManager().beginTransaction();&&&& if(details == null){&&&&&&&&& details = new DetailFragment[BooksInfo.TITLES.length];&&&&&&&& for(int i = 0; i & details. i ++){&&&&&&&&&&&& details[i]= DetailFragment.newInstance(i);&&&&&&&&&&&&&ft.add(R.id.details,details[i]);&&//或者使用add(id, fragment, tag),同时为fragment指定tag&&&&&&& }&&&& }&&&&&&&&&&&&//根据用户点击的书目序号,将相应的简介显示,而将其他简介隐藏。&&&&& for(int i = 0 ; i& details. i ++){&&&&&&&& if(i == index)&&&&&&&&&&&&&ft.show(details[i]);&&&&&&&& else&&&&&&&&&&&&&&ft.hide(details[i]);&&&& }&&&&&&&&&&&&//任何fragment transaction处理后,都通过commit()进行确认。&&&&&<mit();&}&在之前的基础小例子中,使用了replace(),相当于执行了remove()和add()的操作。commit()是加入UI线程的执行操作。再谈FragmentManagerFragmentManager是在activity中与fragment对象进行互操作的接口,在activity和fragment(已与activity关联attach)中可以通过getFragmentManager()获取。通过管理器,可以获得fragement transaction,根据id,tag等获取fragment。我们可以通过管理器的dump()功能输出debug信息。或者使用getFragmentManager().enableDebugLogging(true);来提供相关的debug功能。调用其他fragment的方法FragmentManager管理与activity相关的所有fragment。如果在fragment A中要调用到Fragment B的某个方法,可以通过管理器找到其他fragment的对象,如下处理:FragmentB fragOther = (FragmentB)getFragmentManager().findFragmentByTag(“b”);&fragOther.someMethod( … );唤起activity在fragment可以直接使用startActivity()和startActivityForResult()方法,以及回调函数onActivityResult()。唤起fragment和相互通信如果在fragment A中要唤起 fragment B,在FragmentA中处理如下:FragmentB bFrag& = new FragmentB();&bFrag.setTargetFragment(this, 0);&getFragmentManager()fm.beginTransaction().add(bFrag, "work").commit();创建和通过transaction加入没有什么特别,关键是setTragetFragment(),这样在FragmentB中就可以获得FragmentA的对象,可调用FragmentA的方法,Fragment B的代码例子如下:TextView tv = (TextView)getTargetFragment().getView().findViewById(R.id.text1);tv.setText(“Set from the called fragment”);一些其它有时在应用中为了某种逻辑,使用没有view层级的,即不可视的fragment,用之存储一些信息,当activity或者fragment由于UI配置改变进行re-create时,提供帮助。在基础小例子中,学习了Fragment类以及子类ListFragment,此外还有DialogFragment,PreferenceFragment和WebViewFragment。
阅读(940)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'android fragment(下)',
blogAbstract:'对于fragment,经常涉及不同屏幕尺寸和不同的排版风格。我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖排时,如下图显示:屏幕上只显示一个fragment,点击列表上的数目,进入到简介的activity。下面介绍实现的方式。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:9,
publishTime:3,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'河北保定人',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}Android 让多个Fragment 切换时不重新实例化 - 短裤党 - ITeye技术网站
博客分类:
在项目中需要进行Fragment的切换,一直都是用replace()方法来替换Fragment:
public void switchContent(Fragment fragment) {
if(mContent != fragment) {
mContent =
mFragmentMan.beginTransaction()
.setCustomAnimations(android.R.anim.fade_in, R.anim.slide_out)
.replace(R.id.content_frame, fragment) // 替换Fragment,实现切换
.commit();
但是,这样会有一个问题:
每次切换的时候,Fragment都会重新实例化,重新加载一边数据,这样非常消耗性能和用户的数据流量。
就想,如何让多个Fragment彼此切换时不重新实例化?
翻看了Android官方Doc,和一些组件的源代码,发现,replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。
正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。
这样就能做到多个Fragment切换不重新实例化:
public void switchContent(Fragment from, Fragment to) {
if (mContent != to) {
mContent =
FragmentTransaction transaction = mFragmentMan.beginTransaction().setCustomAnimations(
android.R.anim.fade_in, R.anim.slide_out);
if (!to.isAdded()) {
// 先判断是否被add过
transaction.hide(from).add(R.id.content_frame, to).commit(); // 隐藏当前的fragment,add下一个到Activity中
transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
gundumw100
浏览: 2552544 次
来自: 上海
感谢楼主分享,正好解决了我的问题。不过发现,重写ViewPag ...
一级苦工 写道弱弱的问一句,第一种方法能监听到用户是否点击发送 ...
弱弱的问一句,第一种方法能监听到用户是否点击发送按钮并成功发送 ...
楼主牛叉。Android Fragment生命周期——多屏幕支持 - 博客 - 伯乐在线
& Android Fragment生命周期——多屏幕支持
& 3.2K 阅读
在使用Fragment之前,Fragment的生命周期是一个需要关心的问题。目前,要想在Android上开发出一款APP必须得考虑到“碎片化”的问题,或者说必须考虑多屏幕适配,这是每一个开发者都必须面对的问题。
现在市场上手机的屏幕分辨率、尺寸五花八门,更糟糕的是,除了手机外还有平板!我们都清楚,就单单屏幕尺寸来说手机和平板差异很大。所以,当我们开发应用程序的时候,要谨记我们的APP应该能适用于不同的设备上而且必须达到最优效果,这样才能确保获得更佳用户体验。于是问题就产生了,我们需要调整应用在手机和平板上显示相同的效果,也就是现在所说的多屏幕适配。在之前的一篇里,我已经讲了怎么用Android的一些特性做多屏幕支持,比如创建不同的布局文件等等。这个方式现在也还可以这么做,但是已经不能满足我们的要求了。
一个经典的例子是,应用中有一个列表,用户点击列表条目就可以显示详细信息。这种情况下,我们可以使应用在手机和平板上有不同的体验效果。在手机上需要两个Activity来完成这个功能,如图:
当用户点击后,出现的界面是这样的:
而在平板上,我们我们需要好好利用屏幕,把列表和详情显示在一起,如图:
从上面的例子我们清楚地看到,我们需要一个方法去“合并Activity”,让其中一个Activity调用另一个时,两个Activity都能同时或者先后显示。我们需要在不重写代码的情况下重新组织界面布局,而仅仅使用多布局来做是不行的,我们需要别的技术。
在Android3.0上引入了一个新概念叫Fragment。它有自己的布局文件,可以作为组件排布,也可以相互组合去实现不同的布局显示。使用Fragment可以重复利用代码,并且可以满足不同设备尺寸的需求。Fragment不能单独存在,只能存在于Activity中,而一个Activity可以拥有多个Fragment。很重要的一点是,Fragment可以和Activity中的其它组件一起使用,无需重写所有Activity的接口。所以使用Fragment就可以这样来完成上例中“主界面—详细界面”的APP需求。
在手机上是这样显示的:
而在平板上是这样的:
Fragment生命周期
既然我们已经知道了Fragment很好用,那么我们也需要知道它的工作原理。Fragment只能存在于(作为容器的)Activity中,每一个Fragment都有自己的视图结构,可以像我们之前那样载入布局。Fragment的生命周期更加复杂,因为它有更多的状态,如图:
我们来看一下Fragment完整的生命周期。
在Fragment生命周期开始,onInflate方法被调用。要注意的是,这个方法只在我们直接用标签在布局文件中定义的时候才会被调用。我们可以在这个方法中保存一些在xml布局文件中定义的配置参数和一些属性。
这一步过后就轮到onAttach被调用了。这个方法在Fragment绑定到它的父Activity中的时候被调用,我们可以在这里保存它和Activity之间的引用。
之后onCreate会被调用。这是最重要的步骤之一。Fragment就是在这一步中产生的,可以用这个方法来启动其它线程来检索数据,比如从远程服务器中启动。
onCreateView这个方法是在Fragment创建自己的视图结构的时候被调用,在这个方法中我们会载入Fragment的布局文件,就像我们在ListView控件中载入布局一样。在这个过程中,我们不能保证父Activity是否已经创建,所以有一些操作我们不能在这里完成。
可以看到,在onActivityCreated后Activity才算是建立完成。到这一步,我们的Activity就创建成功并激活了。我们可以随时使用它了。
下一步就是onStart了,在这里我们做的事和Activity中的onStart一样,在这个方法中Fragment虽然可以显示,但是还不能和用户进行交互,只有在onResume后Fragment才能开始和用户进行交互操作。在这个过程后,Fragment就已经启动并运行起来了。
也许会暂停Activity。Activity的OnPause方法会被调用。这时候Fragment的onPause方法也会被调用。
系统也可能会销毁Fragment的视图显示,发生这种情况时onDestroyView方法就被调用了。
之后,如果系统需要完全销毁整个Fragment的话,onDestroy方法就会被调用了。这时候我们就需要释放掉所有可用的连接了,因为这个时候Fragment马上就要被杀掉了。虽然是在准备销毁的过程中,但是Fragment仍然绑定在父Activity中。
最后一步就是把Fragment从Activity中解绑,即调用onDetach方法。
怎么创建一个Fragment
现在我们了解了Fragment的生命周期了,接着我们就需要知道怎么创建一个Fragment并绑定到Activity中,第一件要做的事就是继承android.app.Fragment来写一个Fragment,假设我们的Fragment叫做Fragment1,创建和定义如下:
public class Fragment1 extends Fragment {
就像我们上面说的,Fragment只能存在于Activity中,所以我们必须要在某处定义它,有两种方式:
- 直接在xml布局文件中定义;
- 在xml布局文件中定义一个占位符,然后动态地在Activity中操作Fragment;
我们定义Fragment的方式会影响它的生命周期,因为在上述第一种情况下onInflate方法会被调用,而第二种情况下它的生命周期是从onAttach方法开始的。
如果我们在XML文件中定义Fragment的话,我们需要:
&fragment android:id=&@+id/f1&
class=&com.survivingwithandroid.fragment.Fragment1&
android:layout_width=&match_parent&
android:layout_height=&20dp&/&
然而如果我们在XML中用占位符的话,需要再做一些工作。
布局框架和Fragment
如果我们在XML布局文件中定义Fragment的话,就不能自由、动态修改Fragment了,还有别的方法可以让我们可以更灵活地操作:使用时需要在XML文件中定义:
&FrameLayout android:id=&@+id/fl1&
android:layout_width=&match_parent&
android:layout_height=&200dp&/&
在Activity里面还需要做一点工作,因为我们必须手动初始化Fragment,然后把它“插入”到FrameLayout中。
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment2 f2 = new Fragment2();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fl1, f2);
ft.commit();
关于FragmentTransaction等内容的讨论我们留到下一篇文章再说吧,本文就到这里了。
关于作者:
为作者带来更多读者;为读者筛选优质内容;专注IT互联网。
最新评论(期待您也参与评论)
汇集优质的Python技术文章和资源。人生苦短,我用Python!
JavaScript, CSS, HTML5 这里有前端的技术干货!
关注安卓移动开发业界动态,分享技术文章和优秀工具资源。
关注iOS移动开发业界动态,分享技术文章和优秀工具资源。
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线博客团队正试图以我们微薄的力量,把优秀的原创/译文分享给读者,做一个小而精的精选博客,为“快餐”添加一些“营养”元素。
欢迎关注更多频道
&#8211; 分享和发现有价值的内容与观点
&#8211; 为IT单身男女服务的征婚传播平台
&#8211; 优秀的工具资源导航
&#8211; 翻译传播优秀的外文文章
&#8211; 国内外的精选博客文章
&#8211; JavaScript, HTML5, CSS
&#8211; 专注Android技术分享
&#8211; 专注iOS技术分享
&#8211; 专注Java技术分享
&#8211; 专注Python技术分享
(加好友请注明来意)
网站使用问题
请在询问或者反馈
& 2015 伯乐在线
赞助云主机

我要回帖

更多关于 android fragment嵌套 的文章

 

随机推荐