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
?我知道这是一篇旧帖子,您现在可能已经解决了它,但这是我在谷歌搜索相同问题时发现的第一件事,所以希望这可以帮助某人(也可能是我自己,当我在几个月内搜索相同问题时)时间)。
如果您调用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)
我正在反向迭代片段,因此我添加的最后一个片段将首先返回。