垃圾收集销毁的活动和backstack中的所有片段都显示而不是仅显示当前活动

时间:2013-03-08 23:47:45

标签: android android-fragments

因此,当您离开某个活动时,我已启用该设置以消除行为 设置=>开发人员选项=>不要保留活动

这应该基本上复制一个被收集的活动或片段,然后我必须通过bundle savedinstancestate恢复数据。

所以我理解它是如何工作的。但是当我从片段1导​​航到片段2然后将应用程序放在后台然后放在前台(破坏活动)时 片段1和片段2都同时显示。其中只应显示片段2。

我不知道这是否是我必须管理隐藏和显示片段onsavedinstance的标准。或者,如果我的代码中的某些内容破坏了。下面是我如何推送我希望有用的片段:

public void pushFragmentWithAnimation(FragmentManager fm, int parentId, Fragment currentFrag, Fragment newFrag, int animEntry, int animExit) {
    hideSoftKeyboard(currentFrag.getActivity());
    FragmentTransaction ft = fm.beginTransaction();
    // See: http://developer.android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int)
    ft.setCustomAnimations(animEntry, animExit, animEntry, animExit);
    ft.add(parentId, newFrag, String.format("Entry%d", fm.getBackStackEntryCount())).hide(currentFrag).show(newFrag);
    ft.addToBackStack(null);
    ft.commit();
}

片段1仍然在后台,因为当我按下时我只看到片段1.如果你知道为什么会这样,请告诉我。

2 个答案:

答案 0 :(得分:1)

XML添加的生命周期片段和以编程方式添加的片段相差很大,使得混合它们是个坏主意,详见here

最简单的方法是通过使用相同ID的FrameLayout替换XML膨胀的Fragment以编程方式添加所有片段,然后在onCreate add中添加

FragmentManager fragMgr = getSupportFragmentManager();
if (null == fragMgr.findFragmentByTag(FRAG_TAG))
{
    fragMgr.beginTransaction().
        add(R.id.fragment, new Fragment1(), FRAG_TAG).commit();
}

FRAG_TAG是任何唯一字符串。这样可以确保仅在Fragment1不在布局中时才会创建它。

答案 1 :(得分:0)

我不完全确定为什么这个解决方案有效。我假设它与活动被杀死有关,它不会跟踪当前显示的片段并显示所有片段。所以基本上我需要替换:

ft.add(parentId, newFrag, String.format("Entry%d", fm.getBackStackEntryCount())).hide(currentFrag).show(newFrag);

ft.replace(parentId, newFrag, tag);

然后当我在主要活动中创建初始片段时。

时我才会这样做
if(savedInstanceState==null){

我的更新代码如下:https://github.com/CorradoDev/FragmentTest/tree/2c53f9f42e835da768f61b0233f3ab5b3adf2448