38

savedInstanceState()フラグメントを削除するときに状態を保存し、フラグメントをバックスタックからポップするときに状態を復元するために使用できますか? バックスタックからフラグメントを復元すると、savedInstanceState バンドルは常に null になります。

現在、アプリ フローは次のとおりです: フラグメントの作成 -> フラグメントの削除 (バック スタックに追加) -> バック スタックからのフラグメントの復元 (savedInstanceState バンドルは null)。

関連するコードは次のとおりです。

public void onActivityCreated(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle bundle = getArguments();
    Long playlistId = bundle.getLong(Constants.PLAYLIST_ID);
    int playlistItemId = bundle.getInt(Constants.PLAYLISTITEM_ID);

    if (savedInstanceState == null) {
       selectedVideoNumber = playlistItemId;
    } else {
       selectedVideoNumber = savedInstanceState.getInt("SELECTED_VIDEO");
    }
}

public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(Constants.SELECTED_VIDEO, selectedVideoNumber);
    }

onSavedInstanceState()問題は、削除されてバックスタックに追加されたときに呼び出されないことだと思います。onsavedInstanceState() を使用できない場合、これを修正する別の方法はありますか?

4

4 に答える 4

7

onSaveInstanceState は (残念ながら) 通常のバックスタックでのフラグメントの再作成では呼び出されません。http://developer.android.com/guide/components/fragments.html#Creatingと、バックスタックに追加されたときにフラグメント状態を維持するにはどうすればよいですか?の回答を確認してください。

于 2012-07-09T16:35:55.027 に答える
5

返すビューを onCreateView にグローバル変数として保存し、戻ったときにこれを確認するだけです。

if(mBaseView != null) {
        // Remove the view from the parent
        ((ViewGroup)mBaseView.getParent()).removeView(mBaseView);
        // Return it
        return mBaseView;
    }
于 2013-07-25T22:18:00.520 に答える
3

問題は、フラグメントを追跡するために、フラグメントにIdorTagを関連付ける必要があることです。FragmentManager

これを行うには、少なくとも 3 つの方法があります。

  1. xml レイアウトで、フラグメントの を宣言Idします。

    android:id=@+id/<Id>
    
  2. フラグメント コンテナViewに がある場合は、 FragmentTransactionIdを使用します。

    FragmentTransaction  add (int containerViewId, Fragment fragment)
    
  3. フラグメントがどのフラグメントとも関連付けられていない場合View(例: ヘッドレス フラグメント)、次のように指定しTagます。

    FragmentTransaction  add (Fragment fragment, String tag)
    

また、このSOの回答も参照してください。

于 2014-07-17T21:54:05.000 に答える
0

FWIW、私もこれをヒットしましたが、私の場合は onSaveInstanceState が適切に呼び出され、スマートフォンで新しいアクティビティ フラグメントが起動されたときに状態データをプッシュしました。あなたと同じように、onActivityCreated は、savedInstanceState が常に null で呼び出されました。私見、それはバグだと思います。

静的な MyApplication 状態を作成し、「グローバル変数」に相当するデータをそこに置くことで回避しました...

于 2013-07-23T16:22:54.513 に答える