Question

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

L'activité qui contient le fragment a une disposition de portrait dans / res / disposition /, et une disposition du paysage presque identique dans / res / disposition-land /. Les deux dispositions incluent le fragment comme tel:

<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>

La classe de fragments avec laquelle j'ai testé est:

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) { ... }
}

Notez que j'utilise le package d'assistance avant 3,0 pour les fragments, amené 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 tu peux le voir, onSaveInstanceState() n'est jamais appelé, et le fragment obtient toujours un nul savedInstanceState, à la fois onCreate() et onActivityCreated().

J'ai essayé myFragment.setRetainInstance(true) Dans mes activités onCreate(), mais cela n'a rien changé.

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

J'ai examiné l'un des exemples d'actionbarsherlock (com.actionbarsherlock.sample.shakespeare) et les fragments y ont leur onSaveInstanceState() Méthodes appelées correctement. Pour autant que je sache, cet exemple est écrit exactement comment est mon code - les fragments inclus à la fois à la fois par une mise en page et un XML de mise en page. J'ai même construit cet échantillon en utilisant exactement la même version de ActionBarsherlock que mon projet principal utilise, et l'enregistrement de l'état d'instance fonctionne bien pour cet exemple.

Comment conserver mon état de fragments à travers les rotations d'écran? Pourquoi pas onSaveInstanceState() être appelé?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top