更改碎片的顺序



我正在使用FragmentManager向活动动态添加片段。如何在不需要重做整个片段的情况下,在另一个片段之前添加一个新片段,而不是仅在末尾添加?

例如,在活动中,有三个片段垂直显示,如下所示:
FragA
FragB
FragC

当我添加第四个片段NewFragD时,它们现在应该这样排列:
FragA
NewFragD
FragB
FragC

您需要这样的东西:

@Override
public Fragment getItem(int position) {
if (position == 0) return new frg1();
else if (position == 1) if (newFragment)return new Mapfrag2(); else return frg2()
else if (position == 2) return new frg3(); 
else return new frg1();
}

我也遇到过类似的问题,我认为不可能对已经提交的片段进行重新排序。

我发现,解决这个问题的方法比按正确顺序清除和重新添加片段要好,就是按正确顺序添加所有潜在的片段,然后在它们准备好显示时显示/隐藏。

因此,在您的示例中,您最初会有:

transaction.add(FragA)
transaction.add(FragD)
transaction.add(FragB)
transaction.add(FragC)

然后在提交事务之前的这一行

transaction.hide(FragD)

当显示frag时,您将创建另一个事务并添加这行

transaction.show(FragD)

这样做更好,因为所有的碎片都不需要再次经历生命周期。我发现,使用show/hide而不是尝试向事务中添加片段,可以得到更清晰、更高性能的代码。

只有当你对所有潜在的碎片都有一个固定的顺序时,这才会起作用,如果你需要动态更改顺序,那么每次需要更新时,你都会按照正确的顺序清除和添加碎片。

最新更新