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

时间:2018-04-26 16:44:38

标签: android android-viewpager fragment fragmentmanager

我有一个名为“mainActivityContainer”的linearLayout容器的主要活动。在这个容器中,我做了许多片段事务,管理后台导航的后台。我使用 getSupportFragmentManager 管理所有交易。

现在,我在片段sportsFragment中加载了“mainActivityContainer”。 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();

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

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

如果我这样做,但没有打开日历,更准确地说没有为自定义日历添加/删除事务,不会发生崩溃。

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

我研究过这篇文章Android Fragment no view found for ID?和这篇文章Communication between nested fragments in Android,但我找不到适合我问题的合适解决方案。

1 个答案:

答案 0 :(得分:0)

经过多次测试和试验后,我用正常的getFragmentManager替换了getChildFragmentManager,这解决了我的问题。