web-dev-qa-db-ja.com

ビューからフラグメントを削除しようとすると、mNextAnimでNullPointerExceptionが発生します

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();

アップデート1

map_info_layoutmap_infoに変更しましたが、表示されるエラーに変更はありません。以前はmap_info_layoutがMapInfoFragmentのレイアウトxmlのルートFrameLayoutのidとして定義されていたので、map_info_layoutmap_infoは同じものを指していたと思います。

更新2:私のソリューション

Android.support.v4.app.FragmentではなくMapInfoFragment拡張Android.app.Fragmentがあり、Android.app.FragmentTransactionではなくAndroid.support.v4.app.FragmentTransactionを使用していたことがわかりました。古いデバイスの互換性に興味がないので、すべてをAndroid.app.に切り替えました。 Flloに感謝します。

更新3:一般的なソリューション

Nullオブジェクトを非表示にしようとするのをやめる

45
Koeber

あなたはこれを自分で解決したことは知っていますが、私に起こったばかりなので、このエラーがどのように起こるかを説明したいと思います。

基本的に、hide()remove()などをnull値で呼び出しています。

エラーは明らかではなく、スタックトレースはこれが発生したときに独自のソースから発生したものではないため、それが何であるかを理解することは簡単ではありません。

115
gak

バックスタックにフラグメントがない状態でFragmentManager.popBackstack()を呼び出した場合にも発生します。

8
Christine

これは、現在nullであるフラグメントを追加、表示、または非表示にしているため、使用する前にnullであるかどうかを確認してください!

5
howerknea

私の問題は、FragmentManagerのgetFragments()が一部のフラグメントがnullのリストを返すことがあり、それらのnullフラグメントを削除していたことです。

2
flobacca

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();
}
0
Muhammad Etisam

それは、ナビゲーションドロワーのフラグメントの1つからDialogFragmentを使用して表示したときにのみ起こりました。

newFragment.show(getFragmentManager(), "dialog");

代わりに私が使用した場合

newFragment.show(getChildFragmentManager(), "dialog");

これは起こりませんでした。

注:ダイアログを表示または閉じるときにクラッシュは発生しませんでしたが、ナビゲーションドロワーから別のフラグメントに変更すると発生しました。

0