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>
取り決めは、getFragmentManager()
メソッドを使用せず、代わりにgetSupportFragmentManager()
を使用し、_v4.app.Fragment
_クラスから拡張することでした。 _Android.app.Fragment
_から移動した後、クラッシュすることなく動作しています。
したがって、getFragmentManager()
をそのように使用していて、アプリでライブラリをサポートしている人がいる場合は、サポートマネージャーに移動することをお勧めします。それでもあなたのために働いています。または、私が行ったように、いくつかの奇妙なバグでクラッシュをヒットすることができます。私にアドバイスを与える時間を与えてくれたすべての人に感謝します!
FragmentManager
に存在しないフラグメントでフラグメントトランザクションを実行しているときにこのエラーが発生しました。
fragmentTransaction.hide(fragmentManager.findFragmentByTag("MyTag"));
「MyTag」のフラグメントはFragmentManager
に存在しないため、FragmentTransaction
はnullフラグメントでジョブを実行しようとします。
フラグメントマネージャからnullを削除しようとしました。
これは実際のコードでした:
broadcastFragment = null;
getSupportFragmentManager().beginTransaction().remove(broadcastFragment).commit();
同様の問題が発生し、最初のフラグメントをレイアウトに追加するときにaddToBackStack()
を誤って呼び出していました。それを削除し、それはうまく機能します。明らかなのは、それがO
などのより高いAndroidレベルで機能していることです。
Replace関数は、R.id.list_holderで以前に追加されたフラグメントを削除し、新しいフラグメントを追加します。したがって、フラグメントを削除すると、replace関数によって既に削除されているため、システムはフラグメントを見つけることができません。