J'ai écrit un mannequin d'activité qui permet de commuter entre les deux fragments. Quand vous allez de FragmentA à FragmentB, FragmentA est ajouté à la pile de retour. Cependant, quand je retourne à FragmentA (en appuyant sur l'arrière), un tout nouveau FragmentA est créé et l'état est perdu. J'ai le sentiment que je suis après la même chose que cette question, mais j'ai inclus un exemple de code complet pour aider à la racine de la question:
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);
}
}
}
Avec certains messages du journal a ajouté:
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
Il n'est jamais appel FragmentA.onSaveInstanceState et il crée un nouveau FragmentA lorsque vous frapper en retour. Cependant, si je suis sur FragmentA et je verrouiller l'écran, FragmentA.onSaveInstanceState est appelé. Tellement bizarre...je suis mal dans l'attente d'un fragment ajouté à la pile de retour pour ne pas avoir besoin de re-création? Voici ce que les docs disent:
Tandis que si vous faites appel addToBackStack() lors de la suppression d'un fragment, puis le fragment est arrêté et sera repris si l'utilisateur navigue de retour.