getFragments方法在使用替换事务时仅返回1个片段,用于返回所有

时间:2017-10-19 10:20:53

标签: android android-studio android-fragments fragmentmanager

从SDK 26.0.0-beta1及更高版本开始,使用getFragments https://developer.android.com/reference/android/support/v4/app/FragmentManager.html#getFragments()方法返回一个只包含1个片段的列表,列表的大小也始终为1(因此不包括使用replace方法进行片段导航时,可能误导我的任何可能的空条目。

请注意,我使用的是getSupportFragmentManager,而不是getFragmentManager

在此SDK版本之前,使用replace完成的所有片段事务都将列在getFragments方法中。这意味着如果我替换了10个片段,那么getFragments将返回包含所有这10个片段的列表。

但是,从SDK 26.0.0-beta1 - 特别是 - 以及(26.0.0-alpha1及以下版本没有此问题),该方法始终返回一个大小为1的列表,其中仅包含已替换的最后一个片段。 / p>

为了解决这个问题,我开始使用add并隐藏先前可见片段中的任何一个,到目前为止,这适用于我想要的,这是检查哪个是getFragments中的第一个片段每当我需要时列表,以及查看某个片段的某个实例是否已经在该列表中。

现在当我尝试使用共享元素转换时出现了一个新问题,这只适用于replace(据我的谷歌fu允许我找到)意味着如果我想使用共享元素转换我有要返回使用replace片段而不是add,但我会再次回到最初的问题。

所以现在我陷入了这种困境,希望有人能解决这个问题:

  • 有什么方法可以解决这个问题吗?
  • 当我们只使用getFragments方法时,replace是否只返回1个片段,或者这个行为是未修复的未记录的错误?
  • 是否可以在不使用replace
  • 的情况下在片段之间进行共享元素转换

1 个答案:

答案 0 :(得分:1)

我知道这是一个很老的帖子,你现在可能已经解决了,但这是我在谷歌搜索同样的问题时发现的第一件事,所以希望这有助于某人(当我在一个问题中寻找同样的问题时可能是我自己几个月的时间。)

如果你调用fragmentManager.getBackStackEntryCount(),你应该在backstack上获得所有片段的计数。假设您在添加/替换它们时为其分配了一个标记,然后将它们添加到了Backstack中,然后您可以在Backstack上获取片段的标记,并使用fragmentManager.findFragmentByTag()来获取其实例。

在片段添加/替换期间设置标记:

transaction.replace(R.id.fragment_container, newFragment, fragmentName)
transaction.add(R.id.fragment_container, newFragment, fragmentName)

并将其添加到Backstack:

transaction.addToBackStack(fragmentName);

然后循环你的backstack找到一个特定的片段:

final FragmentManager fragmentManager = getSupportFragmentManager();
for (int i = fragmentManager.getBackStackEntryCount() - 1; i >= 0; i--)
{
    Fragment fragment = fragmentManager.findFragmentByTag(fragmentManager.getBackStackEntryAt(i).getName());
    // ...
}

我正在反向遍历片段,所以我添加的最后一个片段将首先返回。