65

フラグメントを操作しているときに、次の例外が発生することがあります。

FATAL EXCEPTION: main
java.lang.NullPointerException
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:591)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4745)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)

マネージャーからフラグメントを削除しようとしたときに、を介してrun()ofBackStackRecordが呼び出されると、例外が発生します。execPendingTransactions()

case OP_REMOVE: {
  Fragment f = op.fragment;
  f.mNextAnim = op.exitAnim; <----
  mManager.removeFragment(f, mTransition, mTransitionStyle);
}
break;

正確に何が原因なのかわかりませんか?フラグメントを削除するときに、フラグメントのバックスタックが正しくクリーンアップされていないことに関係していると思います。

4

3 に答える 3

160

私自身の質問に答える:

この例外は、(最終的に) 呼び出したときにスローされますFragmentTransaction.remove(null);FragmentTransaction.commit();

編集: また、Twice Circled と ShinyuX がコメントで指摘しているように。show(null)またはadd(null)attach(null)およびメソッドを呼び出すときdetach(null)、そしておそらくまたhide(null)

を呼び出した後commit()、トランザクションは FragmentManager のキューに入れられます。その結果、明示的に を呼び出した後に操作が処理されているFragmentManager.executePendingTransactions()とき、または FragmentManager キュー スレッドがそれを呼び出したときに、NullPointerException.

私の場合、グローバル オブジェクトでフラグメントの状態を維持していました。そこで、フラグメントが表示されているかどうかを確認し、表示されているフラグメントを削除しました。しかし、新しい FragmentActivity を開始したため、これらの状態は表示されていない間も true に設定されていました。したがって、これは設計ミスです。

設計エラーを修正する以外に、解決策は簡単でした。フラグメントを削除する前にFragmentManager.findFragmentByTag()返されたかどうかを確認してください。null

于 2012-11-15T10:03:21.170 に答える
-2

フラグメントの作成にタグは使用しません (TabBar コンテナーのように機能します)。

そのため、タブを変更すると機能しますが、戻るボタンを押すと同じエラーが発生します。

onDestroyView メソッドで FragmentManager#findFragmentById のフラグメント インスタンスを見つけましたが、FragmentManager#findFragmentByTag は null を返します。

class MyFragment extends ListFragment {

@Override
public void onDestroyView() {
    super.onDestroyView();

    if (this.mapFragment != null
            && getFragmentManager().findFragmentById(
                    this.mapFragment.getId()) != null) {

        getFragmentManager().beginTransaction().remove(this.mapFragment)
                .commit();
        this.mapFragment = null;
    }

}
}
于 2013-03-12T18:25:06.033 に答える