Intereting Posts
Фрагменты и уведомления: укажите различные действия из уведомлений; В зависимости от конфигурации экрана Как загрузить файл на Android с помощью Retrofit library? Получить onPause & onResume как события на уровне приложений / задач Recycliewiew Не подключен адаптер; Пропуская макет Android: OnClickListener не отвечает на начальную загрузку? Выравнивание текста в стиле андроид При проверке флажка в списке также проверяются другие случайные флажки Android RecyclerView узнает первый и последний взгляд на ItemDecoration Портирование приложения «100 действий» на фрагменты без смерти Где хранятся чертежи или клипарт из файла android.R.drawable? Лучший способ для совместного использования в Android Как технология push-уведомлений работает на Android? Анимация ObjectAnimator LinearLayout width Как избавиться от подозрительного вызова на Android Studio? Создание WAV-файла из необработанных данных PCM с помощью Android SDK

FragmentStatePagerAdapter с ChildFragmentManager – FragmentManagerImpl.getFragment приводит к исключению NullPointerException

EDIT 2

Теперь мне удалось избавиться от ошибки с помощью трюка отсюда https://code.google.com/p/android/issues/detail?id=42601#c10, так что это reoson, почему мое последнее редактирование размещено сверху Моего вопроса.

Но это привело к следующей ошибке:

java.lang.NullPointerException at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:569) at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211) at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1281) at android.view.View.dispatchRestoreInstanceState(View.java:12043) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2688) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694) at android.view.View.restoreHierarchyState(View.java:12021) at android.support.v4.app.Fragment.restoreViewState(Fragment.java:425) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:949) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4800) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) at dalvik.system.NativeStart.main(Native Method) 

И теперь я не знаю, где продолжить …

Изменить 0 – ПЕРВЫЙ вопрос

Я получаю следующее исключение:

 java.lang.IllegalStateException: No activity at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1091) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877) at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1492) at android.support.v4.app._HoloFragment.performActivityCreated(_HoloFragment.java:251) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4800) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) at dalvik.system.NativeStart.main(Native Method) 

Я не знаю, с чего начать. Я использую обновленную библиотеку поддержки (v4, rev18).

Все работает нормально, пока я не добавлю Fragment который содержит ViewPager в сочетании с FragmentStatePagerAdapter .

Я использую всю библиотеку поддержки, я пробовал решения с https://code.google.com/p/android/issues/detail?id=42601 …

Но ничего не получилось …

Я не знаю, с чего начать, кто-нибудь подскажет?

EDIT 1: ПРЕДПОСЫЛКА и код

1) В моей MainActivity я использую следующее:

На третьей странице есть viewpager …

 public void setPage(int pos, boolean addToBackStack) { Fragment nextFragment = null; FragmentTransaction transaction = null; switch (pos) { case 0: if (mFragmentAllRoutines == null) mFragmentAllRoutines = new RoutinesListFragment(); if (!mFragmentAllRoutines.isVisible()) nextFragment = mFragmentAllRoutines; break; case 1: if (mFragmentRoutine == null) mFragmentRoutine = new RoutineFragment(); if (!mFragmentRoutine.isVisible()) nextFragment = mFragmentRoutine; break; case 2: if (mFragmentDay == null) mFragmentDay = new RoutineDayFragment(); if (!mFragmentDay.isVisible()) nextFragment = mFragmentDay; break; default: break; } if (nextFragment != null) { // Fragment prevFragment = getSupportFragmentManager().findFragmentById(R.id.fragment); transaction = getSupportFragmentManager().beginTransaction(); // if (prevFragment != null) // transaction.detach(prevFragment); transaction.replace(R.id.fragment, nextFragment, nextFragment.getClass().getName()); // transaction.attach(nextFragment); if (addToBackStack) transaction.addToBackStack(null); transaction.commit(); } } 

2) третий фрагмент:

Это простой фрагмент с ViewPager и FragmentStatePagerAdapter. FragmentStatePagerAdapter получает getChildFragmentManager() как FragmentManager. И где-то, похоже, проблема.

Solutions Collecting From Web of "FragmentStatePagerAdapter с ChildFragmentManager – FragmentManagerImpl.getFragment приводит к исключению NullPointerException"

Мне нужно было бы увидеть больше кода, чтобы знать, где его применять … но у меня была аналогичная ситуация, как и вы … Я решил проблему ChildFragmentManager одинаково и получил то же самое NullPointerException , как и у вас.

Мне удалось решить эту проблему … Я попытаюсь описать свое решение, так как с кодом, который вы предоставили, я не уверен, где применять «исправление» … Это действительно исправление … это не Элегантный способ решить эту проблему! Тем не менее, это помогло мне, и мне не нужно восстанавливать состояния, как только я уйду на просмотр пейджера, поэтому нет недостатка для меня.

У меня есть несколько фрагментов, которые реализуют статический бит кода и onDetach (на https://code.google.com/p/android/issues/detail?id=42601#c10 ), каждый фрагмент имеет пейджер и onCreateView Я подключаю адаптер, который расширяет FragmentStatePagerAdapter.

На этих адаптерах я переопределил метод restoreState, чтобы ничего не делать

  @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { //do nothing here! no call to super.restoreState(arg0, arg1); } 

Опять же, это не лучший способ … но это действительно решило мою проблему.

Удачи!

На моей стороне я содержал ссылку на фрагменты ViewPager в содержащем фрагменте и использовал onSaveInstanceState для хранения своих состояний. Я думаю, что NPE произошел потому, что это столкнулось с собственным механизмом ViewPager для восстановления фрагментов. Что я сделал, изменив мою архитектуру из ViewPager, чтобы фрагментировать транзакции, которыми я управляю сам. (ViewPager не было подходящим решением для моего случая)

Я только что наткнулся на ту же проблему.

 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:873) at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215) 

Решение Marc работает, но в моем случае это вызвало задержки на фрагменте с помощью FragmentStatePagerAdapter. Поэтому я переопределил restoreState, названный super, завернул его в try / catch, и он работал без лаг.

 @Override public void restoreState(Parcelable state, ClassLoader loader) { try{ super.restoreState(state, loader); }catch (NullPointerException e){ // null caught } } 

Прежде всего, английский не мой родной язык, если у меня что-то не так в грамматике, скажите, пожалуйста. Я столкнулся с этой проблемой в своем проекте. Сначала я сделал то, что сказал Марк, и это сработало хорошо. Но когда я добавил еще один ViewPager в отцовский фрагмент, новый ViewPager был таким же, как и старый, независимо от того, какой код в этом новом представлении. Наконец я нашел причину. Мы всегда создаем фрагмент, используя метод FragmentTrasaction.replace (R.layout.fragment, fragment). Из-за этого мы создаем новый экземпляр фрагмента, когда мы используем этот метод. Вместо метода replace () я использую метод FragmentTransaction.hide () и show () для переключения фрагмента. Я решил проблему таким образом. Вот мои фрагменты кода:

 @Override public void onClick(View v) { FragmentTransaction transaction = fm.beginTransaction(); switch (v.getId()) { case R.id.tv_schedule_day: hideFragment(transaction); if (dayFragment == null) { dayFragment = new ScheduleDayFragment(); transaction.add(R.id.ll_schedule_content, dayFragment); } else { transaction.show(dayFragment); } transaction.commit(); break; case R.id.tv_schedule_week: hideFragment(transaction); if (weekFragment == null) { weekFragment = new ScheduleWeekFragment(); transaction.add(R.id.ll_schedule_content, weekFragment); } else { transaction.show(weekFragment); } transaction.commit(); break; case R.id.tv_schedule_month: hideFragment(transaction); if (monthFragment == null) { monthFragment = new ScheduleMonthFragment(); transaction.add(R.id.ll_schedule_content, monthFragment); } else { transaction.show(monthFragment); } transaction.commit(); break; private void hideFragment(FragmentTransaction transaction) { if (dayFragment != null) { transaction.hide(dayFragment); } if (weekFragment != null) { transaction.hide(weekFragment); } if (monthFragment != null) { transaction.hide(monthFragment); } } 

Я использую методы hide () и show () для создания фрагмента отключателя, поэтому, когда я использую getChildFragmentManager () во встроенном фрагменте, он не возвращает null. Этот вопрос задавали в 2013 году, я думаю, никто не увидит этого ответа, но я все еще очень рад ответить на этот вопрос.