web-dev-qa-db-ja.com

バックスタックからフラグメントを復元するときのsavedInstanceState

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()を使用できない場合、これを修正する別の方法はありますか?

36
heero

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

6
Eric

私はグローバル変数としてonCreateViewに返すビューを保存したいので、戻ったときにこれをチェックするだけです:

if(mBaseView != null) {
        // Remove the view from the parent
        ((ViewGroup)mBaseView.getParent()).removeView(mBaseView);
        // Return it
        return mBaseView;
    }
5
AllDayAmazing

問題は、Idがそれを追跡するために、フラグメントにTagまたはFragmentManagerが関連付けられている必要があることです。

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

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

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

    FragmentTransaction  add (int containerViewId, Fragment fragment)
    
  3. フラグメントがViewに関連付けられていない場合(たとえば、ヘッドレスフラグメント)、Tagを指定します。

    FragmentTransaction  add (Fragment fragment, String tag)
    

また、こちらをご覧くださいSO answer。

3
bcorso

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

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

0
kenyee