fragment重叠解决方案 already active怎么解决

Activity管理Fragment解析
本文出自Lusfold的博客:&首先Fragment的生命周期完全由所属的Activity掌控,并没有像Activity一样由AMS管理。FragmentActivity生命周期与事件分发先从一张图简单看下各个类之间的关系(这里并没有详细列出所有类以及类的方法,有些不影响分析的类也没有列出):
首先我们来看左边的从Activity到FragmentActivity的继承链条:1.BaseFragmentActivityDonut:一个抽象类,直接父类就是Activity,其中做了主要做了两件事。其一,从Donut可以看出它做了一些兼容工作,这里不展开。其二,定义了抽象方法dispatchFragmentsOnCreateView,并在重写的onCreateView中调用了它,暂且认为Fragment的实例化就是从这里开始的,事实上它最终会调用fragment.newInstance()。2.BaseFragmentActivityHoneycomb:Honeycomb,没错,除了做了一些兼容什么都没干。3.FragmentActivity:它是具有支持Fragment功能的最底层的Activity,后面的AppCompatActivity都是它的子类。接下来我们来看FragmentActivity、FragmentController、FragmentHostCallBack之间的关系:1.FragmentActivity:这其中主要负责Activity生命周期与一些常用事件的分发。例如onCreate()、onResume、onDestory等等这些事件,这也就是Fragment生命周期会与Activity同步的原因,再例如onActivityResult、onKeyDown、onBackPressed等事件的分发。那么这些事件通过什么进行分发呢,就是它持有的FragmentController实例。2.FragmentController:它的介绍如下(简单来说就是负责继续将生命周期分发给它持有的FragmentHostCallback中的FragmentManager):Provides integration points with a {@link FragmentManager} for a fragment host.It is the responsibility of the host to take care of the Fragment’s lifecycle.The methods provided by {@link FragmentController} are for that purpose.3.HostCallbacks:HostCallBacks是FragmentHostCallback的子类,主要实现了像onAttachFragment、onStartActivityFromFragment、onFindViewById等回调方法,从UML图中可以看出它持有Activity引用,是在如上提到的FragmentActivity创建FragmentController时传入。4.FragmentHostCallback:如上所说,它持有FragmentActivity的Activity、Context、Handler等引用,为它所持有的FragmentManager提供资源。5.FragmentManager、FragmentManagerImpl:FragmentManagerImpl是FragmentManager的具体实现类。它可以说是Fragment生命周期管理最重要的类。来看下其中的变量就知道了:ArrayList&Fragment&&mA
ArrayList&Fragment&&mA
ArrayList&Integer&&mAvailI
ArrayList&BackStackRecord&&mBackS
ArrayList&Fragment&&mCreatedM
//&Must&be&accessed&while&locked.
ArrayList&BackStackRecord&&mBackStackI
ArrayList&Integer&&mAvailBackStackI
ArrayList&OnBackStackChangedListener&&mBackStackChangeL
int&mCurState&=&Fragment.INITIALIZING;
FragmentHostCallback&mH
FragmentController&mC
FragmentContainer&mC
Fragment&mP再看Fragment状态分发最主要的方法moveToState(由于篇幅原因仅贴出部分,源码可自己查找):void&moveToState(Fragment&f,&int&newState,&int&transit,&int&transitionStyle,
&&&&&&&&&&&&boolean&keepActive)&{
&&&&&&&&//&Fragments&that&are&not&currently&added&will&sit&in&the&onCreate()&state.
&&&&&&&&if&((!f.mAdded&||&f.mDetached)&&&&newState&&&Fragment.CREATED)&{
&&&&&&&&&&&&newState&=&Fragment.CREATED;
&&&&&&&&if&(f.mRemoving&&&&newState&&&f.mState)&{
&&&&&&&&&&&&//&While&removing&a&fragment,&we&can't&change&it&to&a&higher&state.
&&&&&&&&&&&&newState&=&f.mS
&&&&&&&&//&Defer&start&if&&don't&allow&it&to&move&to&STARTED&or&higher
&&&&&&&&//&if&it's&not&already&started.
&&&&&&&&if&(f.mDeferStart&&&&f.mState&&&Fragment.STARTED&&&&newState&&&Fragment.STOPPED)&{
&&&&&&&&&&&&newState&=&Fragment.STOPPED;
&&&&&&&&if&(f.mState&&&newState)&{
&&&&&&&&&&&&//&For&fragments&that&are&created&from&a&layout,&when&restoring&from
&&&&&&&&&&&&//&state&we&don't&want&to&allow&them&to&be&created&until&they&are
&&&&&&&&&&&&//&being&reloaded&from&the&layout.
&&&&&&&&&&&&if&(f.mFromLayout&&&&!f.mInLayout)&{
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&if&(f.mAnimatingAway&!=&null)&{
&&&&&&&&&&&&&&&&//&The&fragment&is&currently&being&animated...&&but!&&Now&we
&&&&&&&&&&&&&&&&//&want&to&move&our&state&back&up.&&Give&up&on&waiting&for&the
&&&&&&&&&&&&&&&&//&animation,&move&to&whatever&the&final&state&should&be&once
&&&&&&&&&&&&&&&&//&the&animation&is&done,&and&then&we&can&proceed&from&there.
&&&&&&&&&&&&&&&&f.mAnimatingAway&=&
&&&&&&&&&&&&&&&&moveToState(f,&f.mStateAfterAnimating,&0,&0,&true);
&&&&&&&&&&&&}
&&&&&&&&&&&&switch&(f.mState)&{
&&&&&&&&&&&&&&&&case&Fragment.INITIALIZING:
&&&&&&&&&&&&&&&&&&&&if&(DEBUG)&Log.v(TAG,&&moveto&CREATED:&&&+&f);
&&&&&&&&&&&&&&&&&&&&if&(f.mSavedFragmentState&!=&null)&{
&&&&&&&&&&&&&&&&&&&&&&&&f.mSavedFragmentState.setClassLoader(mHost.getContext().getClassLoader());
&&&&&&&&&&&&&&&&&&&&&&&&f.mSavedViewState&=&f.mSavedFragmentState.getSparseParcelableArray(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FragmentManagerImpl.VIEW_STATE_TAG);
&&&&&&&&&&&&&&&&&&&&&&&&f.mTarget&=&getFragment(f.mSavedFragmentState,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FragmentManagerImpl.TARGET_STATE_TAG);
&&&&&&&&&&&&&&&&&&&&&&&&if&(f.mTarget&!=&null)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&f.mTargetRequestCode&=&f.mSavedFragmentState.getInt(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG,&0);
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&f.mUserVisibleHint&=&f.mSavedFragmentState.getBoolean(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FragmentManagerImpl.USER_VISIBLE_HINT_TAG,&true);
&&&&&&&&&&&&&&&&&&&&&&&&if&(!f.mUserVisibleHint)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&f.mDeferStart&=&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(newState&&&Fragment.STOPPED)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&newState&=&Fragment.STOPPED;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&f.mHost&=&mH
&&&&&&&&&&&&&&&&&&&&f.mParentFragment&=&mP
&&&&&&&&&&&&&&&&&&&&f.mFragmentManager&=&mParent&!=&null
&&&&&&&&&&&&&&&&&&&&&&&&&&&&?&mParent.mChildFragmentManager&:&mHost.getFragmentManagerImpl();
&&&&&&&&&&&&&&&&&&&&f.mCalled&=&
&&&&&&&&&&&&&&&&&&&&f.onAttach(mHost.getContext());
&&&&&&&&&&&&&&&&&&&&if&(!f.mCalled)&{
&&&&&&&&&&&&&&&&&&&&&&&&throw&new&SuperNotCalledException(&Fragment&&&+&f
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&&&did&not&call&through&to&super.onAttach()&);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&if&(f.mParentFragment&==&null)&{
&&&&&&&&&&&&&&&&&&&&&&&&mHost.onAttachFragment(f);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&if&(!f.mRetaining)&{
&&&&&&&&&&&&&&&&&&&&&&&&f.performCreate(f.mSavedFragmentState);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&f.mRetaining&=&
&&&&&&&&&&&&&&&&&&&&if&(f.mFromLayout)&{
&&&&&&&&&&&&&&&&&&&&&&&&//&For&fragments&that&are&part&of&the&content&view
&&&&&&&&&&&&&&&&&&&&&&&&//&layout,&we&need&to&instantiate&the&view&immediately
&&&&&&&&&&&&&&&&&&&&&&&&//&and&the&inflater&will&take&care&of&adding&it.
&&&&&&&&&&&&&&&&&&&&&&&&f.mView&=&f.performCreateView(f.getLayoutInflater(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&f.mSavedFragmentState),&null,&f.mSavedFragmentState);
&&&&&&&&&&&&&&&&&&&&&&&&if&(f.mView&!=&null)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&f.mInnerView&=&f.mV
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(Build.VERSION.SDK_INT&&=&11)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ViewCompat.setSaveFromParentEnabled(f.mView,&false);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&f.mView&=&NoSaveStateFrameLayout.wrap(f.mView);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(f.mHidden)&f.mView.setVisibility(View.GONE);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&f.onViewCreated(f.mView,&f.mSavedFragmentState);
&&&&&&&&&&&&&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&f.mInnerView&=&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&case&Fragment.CREATED:
&&&&&&&&&&&&&&&&......至此,FragmentActivity生命周期及事件分发的大致流程已经讲完,接下来说一说FragmentTransactionFragmentTransaction先看下与FragmentTransaction相关的几个类:1.FragmentTransaction:它是抽象类,定义了Transaction相关接口,例如我们经常使用的add()、replace()、remove()、attach、commit()等方法。2.BackStackRecord:它是FragmentTransaction的具体实现类,并实现了Runnable接口(这相当关键)。相关代码:static&final&class&Op&{
&&&&&&&&Op&
&&&&&&&&Op&
&&&&&&&&int&
&&&&&&&&Fragment&
&&&&&&&&int&enterA
&&&&&&&&int&exitA
&&&&&&&&int&popEnterA
&&&&&&&&int&popExitA
&&&&&&&&ArrayList&Fragment&&
&&&&Op&mT非常直白,利用双向链表存储所有操作。没错!FragmentTransaction定义的各种接口实现就是各种类型Op的添加。然后来看下它是如何Commit的:int&commitInternal(boolean&allowStateLoss)&{
&&&&&&&if&(mCommitted)&throw&new&IllegalStateException(&commit&already&called&);
&&&&&&&if&(FragmentManagerImpl.DEBUG)&{
&&&&&&&&&&&Log.v(TAG,&&Commit:&&&+&this);
&&&&&&&&&&&LogWriter&logw&=&new&LogWriter(TAG);
&&&&&&&&&&&PrintWriter&pw&=&new&PrintWriter(logw);
&&&&&&&&&&&dump(&&&&,&null,&pw,&null);
&&&&&&&mCommitted&=&
&&&&&&&if&(mAddToBackStack)&{
&&&&&&&&&&&mIndex&=&mManager.allocBackStackIndex(this);
&&&&&&&}&else&{
&&&&&&&&&&&mIndex&=&-1;
&&&&&&&mManager.enqueueAction(this,&allowStateLoss);
&&&&&&&return&mI
&&&}这个allowStateLoss参数就是那个commitAllowingStateLoss方法确定的(不深入介绍)。最关键的一句:&mManager.enqueueAction(this, allowStateLoss);,继续追踪:public&void&enqueueAction(Runnable&action,&boolean&allowStateLoss)&{
&&&&&&&if&(!allowStateLoss)&{
&&&&&&&&&&&checkStateLoss();
&&&&&&&synchronized&(this)&{
&&&&&&&&&&&if&(mDestroyed&||&mHost&==&null)&{
&&&&&&&&&&&&&&&throw&new&IllegalStateException(&Activity&has&been&destroyed&);
&&&&&&&&&&&}
&&&&&&&&&&&if&(mPendingActions&==&null)&{
&&&&&&&&&&&&&&&mPendingActions&=&new&ArrayList&Runnable&();
&&&&&&&&&&&}
&&&&&&&&&&&mPendingActions.add(action);
&&&&&&&&&&&if&(mPendingActions.size()&==&1)&{
&&&&&&&&&&&&&&&mHost.getHandler().removeCallbacks(mExecCommit);
&&&&&&&&&&&&&&&mHost.getHandler().post(mExecCommit);
&&&&&&&&&&&}
&&&}最终通过使用HostCallback持有的FragmentActivity的Handler向主线程发送消息,让主线程反过来调用FragmentManager的execPendingActions()方法,从而使BackStackRecord的run()(还记得BackStackRecord实现了Runnable接口么)在主线程执行。那么BackStackRecord的run()方法这里就不贴出来了,具体内容总结就是根据不同的操作调用FragmentManager的各种转换Fragment生命周期的方法。其它1.Fragment中onHiddenChanged()与setUserVisibleHint()方法的区别:onHiddenChanged是在我们进行Transaction是进行show或hide操作时的回调,setUserVisibleHint是设置一个标志来确定此Fragment是否对用户可见,原文是:An app may set this to false to indicate that the fragment’s UI is scrolled out of visibility or is otherwise not directly visible to the user.This may be used by the system to prioritize operations such as fragment lifecycle updatesor loader ordering behavior.例如FragmentAdapter在Fragment滑入滑出时会调用此方法,可重写此方法进行懒加载。
上一篇: 英文原文: //the-fabulous-goes-material/ 在经历了264封邮件交流,200+展示模型,30+原型设计,9个多月中的17156次修改之后,我们终于在9月初发布了Material Design版的 Fabulous app。我们非常欣慰的是,我们达到了重新
下一篇: 最近从设计团队那里得到一个需求,让一个特定的view在彩色和灰度之间切换。灰度,一个专用术语,意思是去掉一张图片中的所有饱和度。我快速Google 了一下得到了如下的代码: publicBitmaptoGrayscale(Bitmaporiginal){intheight=original.getHeight();intwidFragment问题
[问题点数:40分,结帖人x]
Fragment问题
[问题点数:40分,结帖人x]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。如何在ViewPager中的各个Fragment间传递数据并刷新Fragment界面_百度知道
如何在ViewPager中的各个Fragment间传递数据并刷新Fragment界面
试图通过fragment: Fragment already active12-02 00:548)我更新Fragment的常用办法是.app:14;AndroidRuntime(8492).toString()):55.v4如果Fragment已经存在,为Fragment定义一个public的方法: E&#47:55,再然后调用这个方法; To update fragment in ViewP&#47: java。考虑到你只有4个Fragment.lang,fragment的实例也不会被销毁.IllegalStateE}然后获取需要更新的Fragment.public void updateDate(Date date) {
mDate = date. and do updating stuff in this method.375: E&#47,而不是FragmentStatePagerAdapter,这样在ViewPager中切换页面时.375:12-02 00.setArguments(Fragment.java:/&#47.Fragment,&#47。而且需要使用FragmentPagerAdapter:14.setText(mDate,可以尝试在activity内用一个Array或者List保存这4个fragment的实例(这种法子比较笨).setArguments(bundle)传递参数将导致异常;
mTextView:
at android, we should implement a public metAndroidRuntime(8492)
资深电脑人
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁在fragment中向另一个fragment传递数据时java.lang.IllegalStateException: Fragment already active
在fragment中向另一个fragment传递数据时java.lang.IllegalStateException: Fragment already active
一般对fragment传递数据都会想到用setArguments(Bundle data)方法,不过是在activity还是在fragment中传递。
但是如果你在fragment调用setArgument方法时,eclipse会抛出java.lang.IllegalStateException:&Fragment&already&active异常。
想想也知道,在一个framgent钟调用setArguments方法设置数据,不是自己给自己设置吗?所以会报错。
看到网上有人说用setter和getter方法,没太明白也没去深究,我觉得应该有一种简单粗暴的方法。。
后来查了一些资料,假设你要传递数据给它的那个目标Fragment名字是a,那么调用a.setArguments就可以了,不要在fragment里面直接调用setArguments。
另外,在上一篇blog中说到嵌套使用fragment的问题
上面那个list中的数据和在
里面的真实数据是相反的。
fragemeng也是用栈来存放顺序,从栈取数据放到list中的顺序应该是取栈顶的数据,然后放在list中的第一个。
在前者中取数据的顺序是从后往前,而在list中放数据的顺序是从前往后。
而我们知道,当前显示在屏幕上的那个fragment的位置应该是在前者的最后一个,因为前者存放fragment的顺序肯定是显示一个然后压栈,当fragment被新的fragment覆盖时,新的fragment被置于栈顶,旧的fragment被覆盖,所以被隐藏。
一句话,显示的那个fragment总是位于那个栈的栈顶的,所以我们如果想要正确的显示和隐藏fragment来达到替换显示fragment的效果的话,应该用下面的语句:
// getParentFragment() ,important
List&Fragment& fragments = getParentFragment().getFragmentManager()
.getFragments();
// getParentFragment() ,important
FragmentTransaction ft = getParentFragment().getFragmentManager()
.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);
ft.add(R.id.root_fragment, fragment);
ft.hide(fragments.get(0));
ft.show(fragment);
ft.addToBackStack(null);
ft.commit();
我的热门文章
即使是一小步也想与你分享如果您查看本文后有所收获,欢迎您永久收藏到自己的账号中,同时也欢迎您分享给您的朋友
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 21:29收藏到了
版权所有,转载本站文章还请保留本站文章或作者地址。 &&
· 蜀ICP备号-1
点击名称选择存放文件夹

我要回帖

更多关于 fragment怎么用 的文章

 

随机推荐