Фрагмент еще не подключен?

Ниже мой код. То, что я пытаюсь достичь, это то, что я показываю зрителя внутри своего обзора Recycler. Внутри пейджер представления я показываю один фрагмент, а при прокрутке влево я показываю другой фрагмент. Но когда я запускаю приложение. Приложение рушится. Не знаю, где я ошибаюсь. Я думаю, что это где-то в концепции фрагмента. Пожалуйста, помогите мне

 @Override
 public void onBindViewHolder(ManageCustomerViewHolder holder, int position) 
 {
     holder.viewPager.setAdapter(new MyPageAdapter(fragmentManager, fragments));
 }

 private List<Fragment> getFragments() 
 {
     List<Fragment> fList = new ArrayList<Fragment>();
     fList.add(MyFragment.newInstance("Fragment 1"));
     fList.add(Myfragment1.newInstance("Fragment 2"));

     return fList;
 }

 public class ManageCustomerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
 {
    ViewPager viewPager;
    viewPager = (ViewPager) itemView.findViewById(R.id.viewpager);

    itemView.setOnClickListener(this);
 }

Вот что такое ошибка:

java.lang.IllegalStateException: Фрагмент еще не подключен.

Ответ 1

Я столкнулся с той же проблемой в своем приложении.

Трассировки стека:

java.lang.IllegalStateException: Fragment has not been attached yet. android.support.v4.app.Fragment.instantiateChildFragmentManager(Fragment.java:2154)
android.support.v4.app.Fragment.getChildFragmentManager(Fragment.java:704)

Приложение разбилось по этой строке:

function performSomeActionInChildFragments() {
    List<Fragment> fragments = getChildFragmentManager().getFragments();
    ...
}

Это происходит, когда фрагмент больше не привязан к его родительской активности/фрагменту. Поэтому простая isAdded() должна решить эту проблему для вас.

Fix:

function performSomeActionInChildFragments() {
    if (!isAdded()) return;
    List<Fragment> fragments = getChildFragmentManager().getFragments();
    ...
}

Из документации:

isAdded() - Возвращает true, если фрагмент в настоящее время добавлен к его активности.

Ответ 2

Обновите версию библиотеки поддержки до версии 27.0.2, чтобы решить эту проблему. См. Журнал изменений.

Ответ 3

Сегодня я столкнулся с этим исключением. После поиска ответа я заметил, что все связано с ViewPager и getFragmentManger() или в моем случае getChildFragmentManager().

Иногда это случается, когда нет фрагмента, поэтому ничто не может быть прикреплено или показано. Поэтому, когда мой фрагмент был создан, я теперь сохраняю в переменной диспетчер фрагментов, затем я использую этот менеджер в моем экземпляре Viewpager, поэтому всегда будет менеджером, сохраненным в классе. Чтобы уточнить, что я говорю здесь, мой код:

До

    ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
    adapter.addFragment(tabLlegadaFragment, "Llegada");
    adapter.addFragment(tabIngresoFragment, "Ingreso");
    viewPager.setAdapter(adapter);

Здесь я столкнулся с ошибкой, потому что я воссоздал представление с помощью некоторого метода, и я также нажал кнопку "Назад". Поэтому, когда это произошло, Android ищет getChildFragmentManager() из фрагмента, который больше не существует или ушел (потому что я нажал кнопку "Назад")

Теперь

    FragmentManager                 childFragMang;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

       View view = inflater.inflate(R.layout.fragment_tab_main, container, false);
       ..
       childFragMang= getChildFragmentManager();
       ..
       return view;

    }

и когда я вызываю Viewpager, я использую этого менеджера

    ViewPagerAdapter adapter = new ViewPagerAdapter(childFragMang);
    adapter.addFragment(tabLlegadaFragment, "Llegada");
    adapter.addFragment(tabIngresoFragment, "Ingreso");
    viewPager.setAdapter(adapter);

Я снова не сталкивался с этим исключением, потому что мой фрагмент исчез, когда я нажал назад, и не было getChildFragmentManager() для вызова

Ответ 4

Вы можете сделать это

FragmentManager childFragmentManager ;

в onCreate:

childFragmentManager = getChildFragmentManager();

тогда вы можете использовать childFragmentManager в

ViewPagerAdapter adapter = new ViewPagerAdapter(childFragmentManager);
adapter.addFragment(tabLlegadaFragment, "Llegada");
adapter.addFragment(tabIngresoFragment, "Ingreso");
viewPager.setAdapter(adapter);

'

'и не забывайте, прежде чем сделать это, вы должны проверить, была ли добавлена ваша активность или нет. Вы можете попробовать так:

if(getActivity()!=null && isAdded()) //do now

Ответ 5

Вы не должны пытаться создать экземпляр фрагментов. Фрагменты создаются и имеют жизненные циклы, которые контролируются системой Android. Вы отвечаете на события жизненного цикла, переопределяя методы обратного вызова, такие как onAttached (называемые, когда фрагмент привязан к его Activity)