Pourquoi mes fragments onSaveInstanceState () ne sont-ils pas appelés?

J'ai un fragment qui a son propre état (sélection de boutons, etc). Cet état est perdu sur une rotation de l'écran.

L'activité qui contient le fragment a une disposition de portrait /res/layout/, et à peu près la même mise en page paysage /res/layout-land/. Les deux dispositions comprennent le fragment comme suit:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <fragment
        android:id="@+id/testFragment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        class="au.com.x.y.TestFragment" />
...</LinearLayout>

Le fragment de classe j'ai testé avec:

public class TestFragment extends android.support.v4.app.Fragment {
    private static final String TAG = "TestFragment";
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate(): " + 
                (savedInstanceState != null ? "NOT NULL" : "NULL"));
    }
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.i(TAG, "onActivityCreated(): " + 
                (savedInstanceState != null ? "NOT NULL" : "NULL"));
    }
    public void onSaveInstanceState(Bundle state) {
        super.onSaveInstanceState(state);
        Log.i(TAG, "onSaveInstanceState()");
        state.putString("saved_thing", "some_value");
    }
    public View onCreateView(
        LayoutInflater inflater,
        ViewGroup container,
        Bundle b) { ... }
}

Remarque que je suis en utilisant le pré-3.0 support package pour les fragments, introduit par ActionBarSherlock.

LogCat me donne:

BEFORE SCREEN ROTATION (PORTRAIT):
02-23 11:45:58.015: I/TestFragment(22629): onCreate(): NULL
02-23 11:45:58.015: I/TestFragment(22629): onCreateView()
02-23 11:45:58.035: I/TestFragment(22629): onActivityCreated(): NULL
AFTER SCREEN ROTATION (LANDSCAPE):
02-23 11:46:00.615: I/TestFragment(22629): onCreate(): NULL
02-23 11:46:00.615: I/TestFragment(22629): onCreateView()
02-23 11:46:00.635: I/TestFragment(22629): onActivityCreated(): NULL

Comme vous pouvez le voir, onSaveInstanceState() n'est jamais appelée, et le fragment obtient toujours une valeur null savedInstanceStatedans les deux onCreate() et onActivityCreated().

J'ai essayé myFragment.setRetainInstance(true) dans mes activités onCreate()mais qui n'a pas changé quoi que ce soit.

Mon onSaveInstanceState() a un @Override, donc je sais que ce n'est pas quelque chose de stupide comme une faute de frappe.

J'ai regardé un des ActionBarSherlock exemples (com.actionbarsherlock.de l'échantillon.de shakespeare) et les fragments y sont onSaveInstanceState() méthodes appelées correctement. Aussi loin que je peux dire, que l'exemple est écrit exactement comment mon code est — fragments inclus à la fois par une mise en page et mise en page-terre XML. J'ai même construit l'échantillon en utilisant exactement la même version de ActionBarSherlock que mon projet principal est l'aide et de l'enregistrement de l'état de l'instance fonctionne très bien pour cet exemple.

Comment puis-je conserver mon fragments de l'état à travers l'écran de rotations? Pourquoi n'est-ce pas onSaveInstanceState() appelée?

source d'informationauteur George