it-swarm.com.ru

NullPointerException: попытка чтения из поля int Android.app.Fragment.mContainerId для ссылки на пустой объект

Возникла интересная проблема с транзакциями на фрагментах ТОЛЬКО на Android Lollipop. Сбой происходит, когда я возвращаюсь и удаляю ранее добавленный фрагмент.

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

FATAL EXCEPTION: main
Process: com.parkme.consumer, PID: 15560
    Java.lang.NullPointerException: Attempt to read from field 'int Android.app.Fragment.mContainerId' on a null object reference
    at Android.app.BackStackRecord$1.onPreDraw(BackStackRecord.Java:1131)
    at Android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.Java:944)
    at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1970)
    at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1061)
    at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5885)
    at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:767)
    at Android.view.Choreographer.doCallbacks(Choreographer.Java:580)
    at Android.view.Choreographer.doFrame(Choreographer.Java:550)
    at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:753)
    at Android.os.Handler.handleCallback(Handler.Java:739)
    at Android.os.Handler.dispatchMessage(Handler.Java:95)
    at Android.os.Looper.loop(Looper.Java:135)
    at Android.app.ActivityThread.main(ActivityThread.Java:5254)
    at Java.lang.reflect.Method.invoke(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:372)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698)

Как я делаю транзакцию:

getFragmentManager().beginTransaction()
            .replace(R.id.list_holder, listFragment)
            .commit();

R.id.list_holder

<FrameLayout
        Android:id="@+id/list_holder"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">
</FrameLayout>

Как я могу удалить это:

 getFragmentManager().beginTransaction()
            .remove(listFragment)
            .commit();

И я получаю сбой на последнем фрагменте кода. 

Обновление

После того, как я удалил, у него больше нет сбоев:

Transition slideTransition = TransitionInflater.from(ParkmeApplication.getContext()).inflateTransition(R.transition.slide_right);
setExitTransition(slideTransition);

slide_right: 

<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <slide
        Android:duration="@Android:integer/config_shortAnimTime"
        Android:slideEdge="right"/>
</transitionSet>
6
Magirus

Сделка заключалась в том, чтобы не использовать метод getFragmentManager() и использовать вместо него getSupportFragmentManager() и расширять класс v4.app.Fragment . После того, как я переехал из Android.app.Fragment, он теперь работает без сбоев.

Так что моя рекомендация для всех, если у вас есть такое использование getFragmentManager() и у вас есть кто-нибудь, кто поддерживает библиотеки, используемые в вашем приложении, тогда просто переходите к менеджеру поддержки. Даже это работает для вас. Или вы можете столкнуться с какой-то странной ошибкой, как я. Спасибо всем, кто получил время, чтобы дать мне советы! 

1
Magirus

Я получал эту ошибку при выполнении транзакции фрагмента для фрагмента, который не существует в FragmentManager:

fragmentTransaction.hide(fragmentManager.findFragmentByTag("MyTag"));

Фрагмент с «MyTag» не существует в FragmentManager, поэтому FragmentTransaction пытается выполнить работу с нулевым фрагментом.

2
Jemshit Iskenderov

Я пытался удалить ноль из диспетчера фрагментов.

Это был фактический код:

broadcastFragment = null;
getSupportFragmentManager().beginTransaction().remove(broadcastFragment).commit();
0
app developer 27

У меня была похожая проблема, и я ошибочно вызывал addToBackStack() при добавлении первого фрагмента в макет. Удалили его, и он хорошо работает ... Очевидно, что он работает на более высоком уровне Android, например, O.

0
Pei

Функция replace удаляет ранее добавленные фрагменты в R.id.list_holder и добавляет новый фрагмент. Таким образом, когда вы удаляете свой фрагмент, система не может найти его, так как он уже был удален функцией замены.

0
Viven