我有一个包含 FrameLayout
的 Activity 。
该 Activity 应显示四个步骤,每个步骤都是一个 Fragment
。当我想回到更远的地方时,我不希望我的 fragment 被重新创建。我想保留它们并简单地在我的 fragment 中替换它们的 View 。
我过去常常先创建我的 fragment ,然后像这样将它们添加到后台堆栈中:
Fragment step= new Frag1ActCompleteFragsCommTrack();
FragmentTransaction ft= getSupportFragmentManager().beginTransaction();
ft.add(step, ""+onStepNr);
ft.addToBackStack(null);
ft.commit();
请注意,我没有显示它,我只是创建它并添加到后台堆栈。
所以,一旦我需要显示一个 fragment ,我就添加它(在这个例子中,我没有从 framelayout
中删除任何 fragment ,只是因为它是我的第一个添加):
FragmentTransaction ft= getSupportFragmentManager().beginTransaction();
ft.add(R.id.my_frameLayout, step);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
所以:问题是我获得了一个
Caused by: java.lang.IllegalStateException: Fragment already added: Frag1ActCompleteFragsCommTrack{410dcb20 #0 id=0x7f050041 -1}
但我想我不能第一次直接添加到我的框架布局中,否则下次我替换它时,我可能会丢失我的 fragment 。我对吗?那么.. 保留可以在框架布局中相互交换的 fragment 的最佳做法是什么?
最佳答案
女士们先生们,我做到了!
如果你添加了一个Fragment
,并且你希望它显示在一个framelayout
中,记得把它放在Fragment backstack中。而已!如果你在框架布局中用另一个替换它,不用担心:你可以通过它的标签找到它把它放回去。
实际上比我想象的要容易
//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”的 fragment 通过上面的代码被一个带有标签“2”的 fragment 替换。如果我想回到第 1 步,我会通过使用 getSupportFragmentManager().findFragmentByTag("1")
简而言之,我认为 FragmentTransaction.replace
也从后台堆栈中删除了 fragment
。事实并非如此(幸运的是)
关于android - 保留 fragment 供以后显示的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17158712/