android – 应用程序被杀死并恢复后,如何在Activity中避免多个片段实例?

android – 应用程序被杀死并恢复后,如何在Activity中避免多个片段实例?,第1张

概述我有一个主屏幕的应用程序,有2个片段(现在)和导航抽屉.目前我在启动时加载片段A(Explore)并在单击时加载片段B.从那时起,我展示并隐藏片段.它比在每次点击时重新创建片段更快,而我的片段A需要一些时间来加载. 我注意到,当我去片段B并从那里去另一个活动(让我们称之为活动2)并离开应用程序并等待它被杀死(或做一些疯狂的事情,比如改变设备语言),然后回到同一个活动,它仍然存在.当我按回去回到片段 我有一个主屏幕的应用程序,有2个片段(现在)和导航抽屉.目前我在启动时加载片段A(Explore)并在单击时加载片段B.从那时起,我展示并隐藏片段.它比在每次点击时重新创建片段更快,而我的片段A需要一些时间来加载.

我注意到,当我去片段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中避免多个片段实例?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1125478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存