Domanda

Ho un frammento che ha il suo stato (pulsanti selezionati, ecc.). Quello stato si perde su una rotazione dello schermo.

L'attività che contiene il frammento ha un layout di ritratto in/res/layout/e un layout del paesaggio quasi identico in/res/layout-land/. Entrambi i layout includono il frammento così:

<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 di frammenti con cui ho testato è:

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

Nota che sto usando il pacchetto di supporto pre-3.0 per i frammenti, introdotto tramite Actionbarsherlock.

Logcat mi dà:

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

Come potete vedere, onSaveInstanceState() non viene mai chiamato e il frammento diventa sempre nullo savedInstanceState, in entrambe onCreate() e onActivityCreated().

ho provato myFragment.setRetainInstance(true) Nelle mie attività onCreate(), ma questo non ha cambiato nulla.

Mio onSaveInstanceState() Ha un @override, quindi so che non è qualcosa di stupido come un errore di battitura.

Ho esaminato uno degli esempi di Actionbarsherlock (com.actionbarsherlock.sample.shakespeare) e i frammenti ci stanno avendo i loro onSaveInstanceState() metodi chiamati correttamente. Per quanto ne so, quell'esempio è scritto esattamente come è il mio codice: frammenti inclusi sia tramite un layout che un XML di layout-terra. Ho anche creato quel campione usando esattamente la stessa versione di Actionbarsherlock del mio progetto principale e il salvataggio dello stato di istanza funziona bene per quell'esempio.

Come posso conservare i miei frammenti dello stato attraverso le rotazioni dello schermo? Perché non lo è onSaveInstanceState() essere chiamato?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top