1. ホーム
  2. android

[解決済み] バックスタックに追加されたフラグメントの状態を維持するにはどうすればよいですか?

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() .