android – getFragments方法在使用替换事务时只返回1个片段,用于返回all

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

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

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

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

为了避免这个问题,我开始使用添加和隐藏以前可见的片段,到目前为止,这适用于我想要的,这是检查哪个是getFragments列表中的第一个片段,只要我需要以及看看是否确定片段的实例已经在该列表中.

现在,当我尝试使用共享元素转换时出现了一个新问题,这只适用于替换(就我的google fu允许我找到),这意味着如果我想使用共享元素转换,我必须返回使用替换片段而不是添加,但我会再次回到最初的问题.

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

>有什么方法可以解决这个问题吗?
>当我们只使用replace方法时,getFragments是否只返回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());
    // ...
}

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

点赞