Wie kann ich den Fragmentstatus beibehalten, wenn ich ihn dem Backstack hinzufüge?

Ich habe eine Dummy-Aktivität geschrieben, die zwischen zwei Fragmenten wechselt. Wenn Sie von FragmentA nach FragmentB wechseln, wird FragmentA dem Backstack hinzugefügt. Wenn ich jedoch zu FragmentA zurückkehre (durch Drücken der Taste "Zurück"), wird ein völlig neues FragmentA erstellt und der Zustand, in dem es sich befand, geht verloren. Ich habe das Gefühl, ich bin nach dem Gleichen wiediese Frage, aber ich habe ein vollständiges Codebeispiel beigefügt, um das Problem zu beheben:

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);
    }
  }
}

Mit einigen hinzugefügten Protokollnachrichten:

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

Es ruft niemals FragmentA.onSaveInstanceState auf und erstellt ein neues FragmentA, wenn Sie zurückschlagen. Wenn ich jedoch auf FragmentA bin und den Bildschirm sperre, wird FragmentA.onSaveInstanceState aufgerufen. So seltsam ... irre ich mich, wenn ich erwarte, dass ein Fragment, das dem Backstack hinzugefügt wurde, nicht neu erstellt werden muss? Hier ist was zumdocs sagen:

Wenn Sie hingegen beim Entfernen eines Fragments addToBackStack () aufrufen, wird das Fragment angehalten und fortgesetzt, wenn der Benutzer zurück navigiert.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage