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

use*_*715 6 android android-fragments android-studio fragmentmanager

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

请记住我正在使用getSupportFragmentManager,而不是getFragmentManager

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

但是,从 SDK 26.0.0-beta1(特别是)及更高版本(26.0.0-alpha1 及更低版本没有此问题)开始,该方法始终返回一个大小为 1 的列表,仅包含最后一个被替换的片段。

为了避免这个问题,我开始使用add和隐藏以前可见的片段,到目前为止,这满足了我想要的目的,即getFragments每当我需要时检查哪个是列表中的第一个片段,以及查看是否有某个实例该列表中已存在一个片段。

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

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

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

aki*_*ler 5

我知道这是一篇旧帖子,您现在可能已经解决了它,但这是我在谷歌搜索相同问题时发现的第一件事,所以希望这可以帮助某人(也可能是我自己,当我在几个月内搜索相同问题时)时间)。

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

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

transaction.replace(R.id.fragment_container, newFragment, fragmentName)
transaction.add(R.id.fragment_container, newFragment, fragmentName)
Run Code Online (Sandbox Code Playgroud)

并将其添加到后台堆栈:

transaction.addToBackStack(fragmentName);
Run Code Online (Sandbox Code Playgroud)

然后循环遍历你的backstack以找到特定的片段:

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

我正在反向迭代片段,因此我添加的最后一个片段将首先返回。