4

我有一个活动FrameLayout。该活动应显示四个步骤,每个步骤都是一个Fragment. 当我想更进一步时,我不希望我的片段被重新创建。我想保留它们并在我的片段中简单地替换它们的视图。

我曾经首先创建我的 Fragments 并将它们添加到 backstack 中,如下所示:

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

请注意,我没有显示它,我只是创建它并添加到后台堆栈。

因此,一旦我需要显示其中的一个片段,我就添加它(在此示例中,我不会从其中删除任何片段,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}

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

4

3 回答 3

4

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

如果添加 a Fragment,并且希望它显示在 a 中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。好像不是这样的(幸运的是)

于 2013-06-18T01:53:41.997 回答
1

你总是可以做类似fragmentManager.putFragment(yourFragment);

于 2013-06-18T00:08:32.800 回答
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();
于 2013-06-18T00:46:10.743 回答