我的活动中包含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中互相交换的片段的最佳做法是什么?
答案 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)
答案 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();