我注意到,当我去片段B并从那里去另一个活动(让我们称之为活动2)并离开应用程序并等待它被杀死(或做一些疯狂的事情,比如改变设备语言),然后回到同一个活动,它仍然存在.当我按回去回到片段B时,有时(50%的时间)片段B被绘制在片段A上.在抽屉中单击片段A时,片段A看起来很好,但是在点击片段B时,还有另一个实例片段A和片段B之上.
我已经花了两天多的时间解决这个问题并且无处可去.
这是我选择片段的代码:
private voID selectItem(int position,boolean addExploreFragment) { Log.d(tag,"selectItem: " + position); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); //add explore fragment - this is called on app startup,but also when the app is killed and resumed which results in 2 explore fragments if (addExploreFragment){ fragmentTransaction.replace(R.ID.content_frame,mExploreFragment,EXPLORE_FRAGMENT_TAG); Log.d(tag,"Replaced frame and added "+ mFragmentTags[position]); } else { //add fragment for the first time if (getSupportFragmentManager().findFragmentByTag(mFragmentTags[position]) == null && position != 0) { fragmentTransaction.add(R.ID.content_frame,mFragments[position],mFragmentTags[position]); Log.d(tag,"Added Fragment: "+ mFragmentTags[position]); } //shows and hIDes fragments for (int i = 0; i < mFragments.length; i++) { if (i == position) { fragmentTransaction.show(mFragments[i]); Log.d(tag,"Showing Fragment: "+ mFragmentTags[i]); } else { if (getSupportFragmentManager().findFragmentByTag(mFragmentTags[i]) != null) { fragmentTransaction.hIDe(mFragments[i]); Log.d(tag,"HID Fragment: "+ mFragmentTags[i]); } } } } fragmentTransaction.commit(); //not null check for calling selectItem(0) before loading the drawer if (mDrawerList != null){ mDrawerList.setItemChecked(position,true); }}
我肯定知道,探索片段被创建两次,两个实例彼此独立行动(只是共享).
我迷路了下一步该做什么.这个问题可以在低端设备上轻松再现,但在像Nexus 4(我的测试设备)这样的设备上,可以通过更改设备语言来重现该问题.
有没有人对此有任何想法?基本上如果在已经有一个exploreFragment时没有调用addExploreFragment块,我认为这个问题可以解决,但我一直无法解决.此外,我尝试删除所有片段,然后添加exploreFragment但同样的事情发生(50%的时间).
谢谢!对于长篇文章感到抱歉,我觉得我应该分享所有的细节.
更新:当我更改设备语言并返回到活动2上的应用程序并返回到Home活动时,它打开了片段B,这很好,但片段A被重新创建,因为它是一个重的片段,系统可能已将其删除从记忆里.再次,如果它被系统删除,它可以重新创建它,但为什么它在未被删除时会被重新创建.我相信这是我的代码,每次第二次尝试(没有关闭应用程序)这种情况发生,重型片段A的2个实例.出于想法.
但是不应该使用fragmentTransaction.replace删除所有先前添加的片段,然后添加exploreFragment.这不是那样的.片段A和片段B都没有被删除.
解决方法 我发现了一些新的东西,而且对我来说很奇怪.当您使用fragmentTransaction.add时,您拥有的侦听器(如前一个片段上的DrawerItemClickListener)仍处于活动状态.即使您使用fragmentTransaction.commit也是如此.所以…我怀疑当使用add方法时,你实际上点击了另一个隐藏的按钮或隐藏的UI,它在前一个片段上有一个事件监听器.我当然不喜欢这个,效果可能很混乱.是的,这件事发生在我身上,我暂时不理解为什么.
目前,我认为最简单的代码修复方法是使用replace方法而不是add. replace()使侦听器处于非活动状态.如果它有效,那么你可以做出更好/更优雅的修复.
让我知道发生什么事….
总结以上是内存溢出为你收集整理的android – 应用程序被杀死并恢复后,如何在Activity中避免多个片段实例?全部内容,希望文章能够帮你解决android – 应用程序被杀死并恢复后,如何在Activity中避免多个片段实例?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)