27

FragmentManagerのバックスタックに保持しているフラグメントがあります。すべてのフラグメント状態は、たとえば次のように、メンバー変数を使用して方向を変更するために保存されます。

@Override
public void onSaveInstanceState(Bundle outState) 
{
    super.onSaveInstanceState(outState);
    outState.putLong("userId", mUserId);
    outState.putString("username", mUsername);
}

私の問題は、方向が変更された場合、バックスタック内のすべてのフラグメントがonSaveInstanceStateを介して呼び出されるため、メンバー変数がもう存在しないため、nullポインター例外が発生することです。

これを解決する方法について何かアイデアはありますか?

4

4 に答える 4

44

のがすべてのフラグメントで死にかけているFragmentManagerため、メンバー変数が存在しなくなっている可能性があります。Activity

状態を保存する前に状態を保存する必要があるため、クラスonSaveInstanceStateのメソッドもオーバーライドする必要があります。ActivityActivityFragments

ドキュメントにあるように:

フラグメントの大部分が破棄される状況は数多くありますが(UIが表示されていない状態でバックスタックに配置された場合など)、フラグメントの状態は、所有するアクティビティが実際に状態を保存する必要があるまで保存されません。

アップデート

Activity onSaveInstanceStateonRestoreInstanceStateで、参照を保存してFragmentから、次のように復元してみてください。

public void onSaveInstanceState(Bundle outState){
    getFragmentManager().putFragment(outState, "myfragment", myfragment);
}
public void onRestoreInstanceState(Bundle inState){
    myFragment = getFragmentManager().getFragment(inState, "myfragment");
}

運が良ければ教えてください!:-)

于 2013-04-09T23:00:05.533 に答える
7

JorgeGilに基づいて構築-'xɔɾ.xɛxilanswer次の点に注意してください。

  • onSaveInstanceState()およびonRestoreInstanceState()のスーパー実装を呼び出すことを忘れないでください。
  • サポートパッケージを使用している場合:getFragmentManager()の代わりにgetSupportFragmentManager()を使用してください。
  • 元のフラグメントを取得するときは、それをキャストする必要があります。

キャプテンが明らかでごめんなさい!

于 2015-08-19T19:57:31.900 に答える
1

フラグメントヘルプにsetRetainInstanceを設定しますか。試してみる

于 2014-11-16T17:26:21.617 に答える
0

適切な解決策は、常に前に呼び出されているように見えるsavedInstanceStateメンバー変数を読み取ることだと思います。のフィールドを処理する場合、次のフィールドの前に初期化される機会はありません(この特別な場合、フラグメントがバックスタックにある場合)。onCreateonSaveInstanceStateonViewCreatedonSaveInstanceState

于 2017-01-25T13:57:00.033 に答える