У меня есть основное действие с контейнером linearLayout под названием "mainActivityContainer". В этом контейнере я делаю много транзакций фрагментов, управляя backstack для обратной навигации. Я управляю всеми транзакциями с 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. Я раскрываю спортивные детали. Я отвечаю, метод onCreateView из sportsFragment вызывается, а затем приложение вылетает, получая эту ошибку.
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 не найден вид для идентификатора? и этот пост Связь между вложенными фрагментами в Android , но я не нашел подходящего и работающего решения для моей проблемы.