Как обрабатывать дочерние фрагменты в пользовательском календаре с FragmentStatePagerAdapter? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть основное действие с контейнером 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 , но я не нашел подходящего и работающего решения для моей проблемы.

1 Ответ

0 голосов
/ 11 июня 2018

После многих испытаний и испытаний я заменил getChildFragmentManager на обычный getFragmentManager, и это решило мою проблему.

...