如何使用 FragmentStatePagerAdapter 处理自定义日历中的子片段?

How to handle child fragments in custom calendar with FragmentStatePagerAdapter?

我有一个主 activity 和一个名为 "mainActivityContainer" 的 linearLayout 容器。在这个容器中,我进行了许多片段事务,管理用于返回导航的后台堆栈。我使用 getSupportFragmentManager.

管理所有交易

现在,我在 "mainActivityContainer" 中加载的片段 sportsFragment 中。 sportsFragment 加载 sportsFragmentXml。 sportsFragmentXml 有一个视图 "mainFragmentContainer",我可以在其中加载运动列表。当我点击 sportsFragmentXml 中的日期过滤器时,我添加了一个带有 getChildFragmentManager 的新片段,一个 customCalendarFragment,到 mainFragmentContainer 中,以便根据日期过滤体育赛事。

getChildFragmentManager()
.beginTransaction()
.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
.add(R.id.mainFragmentContainer, customCalendarFragment)
.addToBackStack(this.getClass().getName())
.commit();

customCalendarFragment 由一个 viewPager 组成,它在 FragmentStatePagerAdapter 的帮助下加载许多较小的片段(可以是数十个较小的片段,它们构成了日历)。我通过动态实例化每个较小的片段在 getItem(int position) 中执行此操作。

@Override
public Fragment getItem(int position) {
return CalendarAdapterFragmentItem.init(monthsList.get(position), dayFilter);
}

用户可以左右滑动选择合适的日期。当用户再次单击 abcFragment 中的日期过滤器或单击某个日期时,我删除了 customCalendarFragment

FragmentManager childFragmentManager = getChildFragmentManager();
childFragmentManager
.beginTransaction()
.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
.remove(customCalendarFragment)
.commit();
childFragmentManager.popBackStack();

到目前为止一切都很好。然后我 select 从包含在 mainFragmentContainer 中的列表中选择一项运动。我打开运动细节。我回击,调用了 sportsFragment 的 onCreateView 方法,然后应用程序崩溃,出现此错误。

java.lang.IllegalArgumentException: No view found for id 0x7f080159 (com.myProject.staging:id/viewPager) for fragment CalendarAdapterFragmentItem{7d97222 #1 id=0x7f080159}

如果我这样做,但没有打开日历,更确切地说,没有为自定义日历进行 add/remove 交易,则不会发生崩溃。

我的问题是:如果随后添加和删除了 customCalendarFragment,为什么我会收到此错误? customCalendarFragment 包含加载许多 CalendarAdapterFragmentItem 较小片段的 viewPager。如果删除了这些元素,为什么会出现此错误?我错过了什么?

我研究了这个 post Android Fragment no view found for ID? and this post 但我没有找到适合我的问题的有效解决方案。

经过多次测试,我用普通的 getFragmentManager 替换了 getChildFragmentManager,这解决了我的问题。