保留碎片以供以后显示的最佳实践

时间:2013-06-18 00:00:00

标签: android android-fragments android-fragmentactivity android-support-library

我的活动中包含FrameLayout。 活动应显示四个步骤,每个步骤为Fragment。当我想再往前走时,我不希望重新创建我的片段。我想保留它们,只需在我的片段中替换它们的视图。

我曾经首先创建我的片段并将它们添加到这样的背板中:

Fragment step= new Frag1ActCompleteFragsCommTrack();
FragmentTransaction ft= getSupportFragmentManager().beginTransaction();
ft.add(step, ""+onStepNr);
ft.addToBackStack(null);
ft.commit();

请注意我没有显示它,我只是创建它并添加到backstack。

所以,一旦我需要展示我的一个片段,我就添加它(在这个例子中,我不会删除framelayout中的任何片段,因为它是我的第一个片段):

FragmentTransaction ft= getSupportFragmentManager().beginTransaction();
ft.add(R.id.my_frameLayout, step);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();

所以:问题是我获得了

  

引起:java.lang.IllegalStateException:已添加片段:Frag1ActCompleteFragsCommTrack {410dcb20#0 id = 0x7f050041 -1}

但我想我第一次不能直接添加到我的framelayout中,否则下次我更换它时,我可能会丢失我的片段。我对吗?那么......保留可以在framelayout中互相交换的片段的最佳做法是什么?

3 个答案:

答案 0 :(得分:4)

女士们,先生们,我做到了!

如果添加Fragment,并希望它显示在framelayout中,请记住将其放入Fragment backstack中。而已!如果你用另一个替换它在framelayout中,不用担心:你可以通过它的标签来找回它。 这比我想象的要容易

//step is an int describing the step associated to the fragment I wanna place
FragmentTransaction ft= getSupportFragmentManager().beginTransaction();
ft.replace(R.id.act_complete_track_frameLayout, f, ""+step);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if(firstAttach)
    ft.addToBackStack(null);
ft.commit();

想象一个带有标记“1”的片段通过上面的代码被标记为“2”的片段替换。如果我想回到第1步,我会通过使用getSupportFragmentManager().findFragmentByTag("1")

获取旧片段来重用该代码

简而言之,我认为FragmentTransaction.replace也从后台取消了fragment。情况似乎并非如此(幸运的是)

答案 1 :(得分:1)

您可以随时执行fragmentManager.putFragment(yourFragment);

之类的操作

答案 2 :(得分:1)

如果我理解正确,你会尝试添加所有片段,但在准备好之前不要显示它们。 FragmentTransaction.add()并不完全是这样做的。它也会在添加之后显示出来。您应该在添加每个片段后使用hide(),然后您可以使用show()使其可见,并再次使用hide()使其他片段不可见。

像这样:

Fragment step = new Frag1ActCompleteFragsCommTrack();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(step, ""+onStepNr);
ft.hide(step);
ft.commit();

然后:

Fragment step = getSupportFragmentManager().findFragmentByTag(""+onStepNr);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.show(step);
// may want to hide other fragments here
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();