web-dev-qa-db-ja.com

NullPointerException:nullオブジェクト参照のフィールド 'intAndroid.app.Fragment.mContainerId'から読み取ろうとしました

Android Lollipop ONLY。戻って、以前に追加したフラグメントを削除すると、クラッシュが発生します。

これがスタックトレースです:

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>
7
Magirus

取り決めは、getFragmentManager()メソッドを使用せず、代わりにgetSupportFragmentManager()を使用し、_v4.app.Fragment_クラスから拡張することでした。 _Android.app.Fragment_から移動した後、クラッシュすることなく動作しています。

したがって、getFragmentManager()をそのように使用していて、アプリでライブラリをサポートしている人がいる場合は、サポートマネージャーに移動することをお勧めします。それでもあなたのために働いています。または、私が行ったように、いくつかの奇妙なバグでクラッシュをヒットすることができます。私にアドバイスを与える時間を与えてくれたすべての人に感謝します!

1
Magirus

FragmentManagerに存在しないフラグメントでフラグメントトランザクションを実行しているときにこのエラーが発生しました。

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

「MyTag」のフラグメントはFragmentManagerに存在しないため、FragmentTransactionはnullフラグメントでジョブを実行しようとします。

3

フラグメントマネージャからnullを削除しようとしました。

これは実際のコードでした:

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

同様の問題が発生し、最初のフラグメントをレイアウトに追加するときにaddToBackStack()を誤って呼び出していました。それを削除し、それはうまく機能します。明らかなのは、それがOなどのより高いAndroidレベルで機能していることです。

0
Pei

Replace関数は、R.id.list_holderで以前に追加されたフラグメントを削除し、新しいフラグメントを追加します。したがって、フラグメントを削除すると、replace関数によって既に削除されているため、システムはフラグメントを見つけることができません。

0
Viven