Фрагмент еще не подключен?
Ниже мой код. То, что я пытаюсь достичь, это то, что я показываю зрителя внутри своего обзора 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
)