3つのフラグメント、1つのNavigationDrawer、1つのMapFragment、および1つのユーザー定義の「MapInfoFragment」があります。特定のイベントではMapFragmentの上に「MapInfoFragment」を半透明に表示し、他のイベントでは表示しないようにします。フラグメントを完全に削除して毎回新しいフラグメントを作成するか、表示される可視性と情報を変更するだけでよいかどうかはあまり気にしません。現在、FragmentManagerの.hide()関数を使用しようとしていますが、.removeと.detachも同様の結果で試しました。
エラー:
03-18 14:28:10.965 24711-24711/com.[packageName].asTest D/AndroidRuntime﹕ Shutting down VM
03-18 14:28:10.965 24711-24711/com.[packageName].asTest E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.[packageName].asTest, PID: 24711
Java.lang.NullPointerException: Attempt to write to field 'int Android.app.Fragment.mNextAnim' on a null object reference
at Android.app.BackStackRecord.run(BackStackRecord.Java:658)
at Android.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1447)
at Android.app.FragmentManagerImpl$1.run(FragmentManager.Java:443)
at Android.os.Handler.handleCallback(Handler.Java:733)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:136)
at Android.app.ActivityThread.main(ActivityThread.Java:5017)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:779)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:595)
Activity_main.xml:
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="com.[packageName].asTest.MainActivity">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:map="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/map"
Android:name="com.google.Android.gms.maps.MapFragment"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
map:cameraZoom="8"
map:mapType="satellite"
map:uiRotateGestures="false"
Android:layout_gravity="center_horizontal|top"
/>
</FrameLayout>
<fragment Android:id="@+id/navigation_drawer"
Android:layout_width="@dimen/navigation_drawer_width"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:name="com.[packageName].asTest.NavigationDrawerFragment"
tools:layout="@layout/simple_list_item_1" />
<fragment Android:id="@+id/map_info"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:name="com.[packageName].asTest.MapInfoFragment" />
</Android.support.v4.widget.DrawerLayout>
問題のあるコード:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.hide(getFragmentManager().findFragmentById(R.id.map_info));
ft.commit();
map_info_layout
をmap_info
に変更しましたが、表示されるエラーに変更はありません。以前はmap_info_layout
がMapInfoFragmentのレイアウトxmlのルートFrameLayoutのidとして定義されていたので、map_info_layout
とmap_info
は同じものを指していたと思います。
Android.support.v4.app.Fragment
ではなくMapInfoFragment
拡張Android.app.Fragment
があり、Android.app.FragmentTransaction
ではなくAndroid.support.v4.app.FragmentTransaction
を使用していたことがわかりました。古いデバイスの互換性に興味がないので、すべてをAndroid.app.
に切り替えました。 Flloに感謝します。
Nullオブジェクトを非表示にしようとするのをやめる
あなたはこれを自分で解決したことは知っていますが、私に起こったばかりなので、このエラーがどのように起こるかを説明したいと思います。
基本的に、hide()
、remove()
などをnull値で呼び出しています。
エラーは明らかではなく、スタックトレースはこれが発生したときに独自のソースから発生したものではないため、それが何であるかを理解することは簡単ではありません。
バックスタックにフラグメントがない状態でFragmentManager.popBackstack()
を呼び出した場合にも発生します。
これは、現在nullであるフラグメントを追加、表示、または非表示にしているため、使用する前にnullであるかどうかを確認してください!
私の問題は、FragmentManagerのgetFragments()が一部のフラグメントがnullのリストを返すことがあり、それらのnullフラグメントを削除していたことです。
Show()およびhide()を適切に呼び出します...
private void showFragment(int fragmentIndex, boolean addToBackStack) {
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
for (int i = 0; i < fragments.length; i++) {
if (i == fragmentIndex) {
transaction.show(fragments[i]);
} else {
transaction.hide(fragments[i]);
}
}
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.commit();
}
それは、ナビゲーションドロワーのフラグメントの1つからDialogFragmentを使用して表示したときにのみ起こりました。
newFragment.show(getFragmentManager(), "dialog");
代わりに私が使用した場合
newFragment.show(getChildFragmentManager(), "dialog");
これは起こりませんでした。
注:ダイアログを表示または閉じるときにクラッシュは発生しませんでしたが、ナビゲーションドロワーから別のフラグメントに変更すると発生しました。