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()を使用できない場合、これを修正する別の方法はありますか?
onSaveInstanceStateは(残念ながら)通常のバックスタックのフラグメントの再作成では呼び出されません。 http://developer.Android.com/guide/components/fragments.html#Creating と、 バックスタックに追加されたときにフラグメントの状態を維持するにはどうすればよいですか?
私はグローバル変数としてonCreateViewに返すビューを保存したいので、戻ったときにこれをチェックするだけです:
if(mBaseView != null) {
// Remove the view from the parent
((ViewGroup)mBaseView.getParent()).removeView(mBaseView);
// Return it
return mBaseView;
}
問題は、Id
がそれを追跡するために、フラグメントにTag
またはFragmentManager
が関連付けられている必要があることです。
これを行うには、少なくとも3つの方法があります。
Xmlレイアウトで、フラグメントのId
を宣言します。
Android:id=@+id/<Id>
フラグメントコンテナView
にId
がある場合、 FragmentTransaction を使用します。
FragmentTransaction add (int containerViewId, Fragment fragment)
フラグメントがView
に関連付けられていない場合(たとえば、ヘッドレスフラグメント)、Tag
を指定します。
FragmentTransaction add (Fragment fragment, String tag)
FWIW、これもヒットしましたが、私の場合、onSaveInstanceStateが適切に呼び出され、新しいアクティビティフラグメントがスマートフォンで呼び出されたときに状態データをプッシュしました。あなたと同じように、onActivityCreatedはw/savedInstanceStateは常にnullと呼ばれていました。私見、私はそれがバグだと思う。
静的なMyApplication状態を作成し、「グローバル変数」に相当するデータをそこに配置することで回避しました...