0

そのため、TextView やその他の要素の設定に使用されるオブジェクト (オブジェクト O) を含むフラグメント (フラグメント A) があります。フラグメントをインスタンス化するには、静的メソッド A.getInstance(O) を使用します。オブジェクト O はシリアライズ可能であるため、instance.setArguments などを使用してバンドルを介してフラグメント A の新しいインスタンスに送信できます。

A の onCreate メソッドで O を取得し、onViewCreated で O を使用してフィールドをセットアップします。ここまではすべて正常に動作します。A を別のフラグメント (フラグメント B)に置き換え、B から A に戻ると、引数 Bundle にオブジェクト O が含まれなくなり、NullPointerException が発生します。Bundle 自体は null ではありませんが、O は含まれていません。

このメソッドを使用してフラグメントを置き換えます。

public void replaceCurrentFragment(Fragment fragment) {
        FragmentTransaction fragmentTransaction = context.getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.frame, fragment).addToBackStack(null).commit();
}

フラグメント A も上記の方法を使用して表示されます。

私は何を間違っていますか?

4

1 に答える 1

1

通知Fragment#onCreate(Bundle savedInstanceState)方法。Fragment fromA#getInstanceメソッドを最初に作成したとき、この渡された Bundle は null になります。あなたと同じFragment#getArgumentsように、メソッドから O オブジェクトを抽出するだけです。将来の使用のためにオブジェクトを保存するには、O オブジェクトを
オーバーライドしてそこに保存します (次のようになる場合があります)。Fragment#onSaveInstanceState

private static final String EXTRA_MY_OBJECT = "com.example.extra_my_object";

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable(EXTRA_MY_OBJECT, mMyObject);
}

そして、Fragment#onCreate渡されたものからオブジェクトを取得できますBundle

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        mMyObject = savedInstanceState.getSerializable(EXTRA_MY_OBJECT);
    }
    if (mMyObject == null) {
        //fragment was created for first time probably, or something went wrong
        //try to get your object from getArguments

    }
}
于 2015-09-11T08:07:55.960 に答える