@kirawa

Как задать целевой фрагмент в item ViewPager?

Здравствуйте. У меня открылась проблема с android oreo. Есть item view pager'a в котором по клику вызывается такой код:
private void startNewOrderDoc() {
        ClientViewPagerContainer fragment  = new ClientViewPagerContainer();
        fragment.setTargetFragment(this, IDD_NEW_ORDER);
        FragmentTransaction fragmentTransaction;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            fragmentTransaction = getActivity().getFragmentManager().beginTransaction();
        } else{
            fragmentTransaction = getChildFragmentManager().beginTransaction();
        }
        fragmentTransaction.addToBackStack(null).replace(R.id.contentMain, fragment).commit();
    }

Программа падает вот с такой ошибкой:
java.lang.IllegalStateException: Fragment ClientViewPagerContainer{a47f4aa #4 id=0x7f090067} declared target fragment JournalFragment{8d871c #4 id=0x7f09024c} that does not belong to this FragmentManager!
Если убрать fragment.setTargetFragment(this, IDD_NEW_ORDER); то работает.
Подскажите в чем проблема и как исправить?
  • Вопрос задан
  • 227 просмотров
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Проблема в том, что
1) не надо использовать фрагменты из платформы (android.app.Fragment). Нужно использовать из саппорт либы.
2) в ветке else, там где getChildFragmentManager. Если посмотреть реализацию этого метода, станет понятно, что внутри него создаётся новый фрагмент менеджер, в котором, естественно, нет фрагмента this.
При коммите такой транзакции фрагмент менеджер проверяет, находится ли тарегт фрагмент в том же менеджере, что и тот, кому его выставили. Не находится. И падает.

Исправить просто. Те фрагменты, что находятся в child fragment manager'e, могут получить доступ к parent'у(в данном случае - this) через getParentFragment.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы