从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
?答案 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());
// ...
}
我正在反向遍历片段,所以我添加的最后一个片段将首先返回。