[解決済み] バックスタックに追加されたフラグメントの状態を維持するにはどうすればよいですか?
2022-04-23 04:16:17
質問内容
2つのフラグメントを切り替えるダミーのアクティビティを書き上げました。 FragmentAからFragmentBに移動すると、FragmentAがバックスタックに追加されます。 しかし、(戻るを押して)FragmentAに戻ると、全く新しいFragmentAが作成され、それまでの状態が失われてしまいます。 と同じことをやっているような気がします。 これ の質問ですが、問題を解決するために完全なコードサンプルを添付しています。
public class FooActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, new FragmentA());
transaction.commit();
}
public void nextFragment() {
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, new FragmentB());
transaction.addToBackStack(null);
transaction.commit();
}
public static class FragmentA extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View main = inflater.inflate(R.layout.main, container, false);
main.findViewById(R.id.next_fragment_button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
((FooActivity) getActivity()).nextFragment();
}
});
return main;
}
@Override public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Save some state!
}
}
public static class FragmentB extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.b, container, false);
}
}
}
いくつかのログメッセージを追加しました。
07-05 14:28:59.722 D/OMG ( 1260): FooActivity.onCreate
07-05 14:28:59.742 D/OMG ( 1260): FragmentA.onCreateView
07-05 14:28:59.742 D/OMG ( 1260): FooActivity.onResume
<Tap Button on FragmentA>
07-05 14:29:12.842 D/OMG ( 1260): FooActivity.nextFragment
07-05 14:29:12.852 D/OMG ( 1260): FragmentB.onCreateView
<Tap 'Back'>
07-05 14:29:16.792 D/OMG ( 1260): FragmentA.onCreateView
FragmentA.onSaveInstanceStateを呼び出すことはなく、ヒットバックすると新しいFragmentAが作成されるのです。 しかし、FragmentAにいるときに画面をロックすると、FragmentA.onSaveInstanceStateが呼び出されるのです。 バックスタックに追加されたフラグメントは再作成の必要がないと思っていたのは間違いだったのでしょうか? 以下は ドキュメント と言ってください。
<ブロッククオート一方、フラグメントを削除する際にaddToBackStack()を呼び出した場合。 の場合、フラグメントは停止し、ユーザがナビゲートすると再開されます。 に戻る。
解決方法は?
バックスタックからフラグメントに戻った場合、フラグメントは再作成されず、同じインスタンスが再利用され、そのインスタンスは以下のように開始されます。
onCreateView()
フラグメントライフサイクルの中で
フラグメントライフサイクル
.
そのため、状態を保存したい場合は、インスタンス変数と
ではなく
に依存する。
onSaveInstanceState()
.
関連
-
adb devices OffLine Solution(オフラインソリューション
-
AndroidエミュレーターのADBサーバーがACKしない問題
-
AndroidがMainActivityが包含クラスでないというエラーを報告する
-
Google PlayデバイスはPlay保護機構の認証を受けていません。
-
AndroidでListViewを使ってカスタムテーブルを描画する
-
android studioが新しいプロジェクトを作成しますが、プロジェクトの同期に成功するまでデザインエディタが使用できません。
-
Android.support.v7.widget.Toolbar が見つかりませんでした。
-
[解決済み] インスタンス状態の保存を使用してアクティビティ状態を保存するにはどうすればよいですか?
-
[解決済み] ViewPagerでFragmentが表示されるタイミングを決定する方法
-
[解決済み] フラグメントのインスタンス状態をバックスタックに正しく保存する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
AAPT2エラーについて:詳しくはログをご確認ください。
-
android.os の NetworkOnMainThreadException。
-
プログラム "git.exe "を実行できない場合の正しい解決方法です。CreateProcessエラー=2
-
AndroidがMainActivityが包含クラスでないというエラーを報告する
-
最新のandroidプロジェクトディレクトリにあるarmeabi-v7aとarmeabiの具体的な意味とその違いを教えてください。
-
Google PlayデバイスはPlay保護機構の認証を受けていません。
-
Error:A problem occurred configuring project ':app'. > ビルドを見つけられませんでした。
-
Android ProgressBarのスタイルカラーを変更する
-
アンドロイドシェイプ、グラデーション、角丸、ボーダーラインの設定
-
アンドロイドの遅延実行のいくつかの方法