Perché non sono chiamati i miei frammenti onSaveInstanceState ()?

Ho un frammento che ha il proprio stato (pulsanti selezionati, ecc.). Quel stato è perso su una rotazione dello schermo.

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

  • Come connettersi al mio server http: // localhost da Android Emulator in Eclipse
  • Come crittografare le risorse HTML + JS nell'applicazione mobile Android Phonegap?
  • Come submit / ricevere notifiche push da un'applicazione mobile ionica?
  • Contando quante volte la mia applicazione Android è stata aperta
  • Rileva se una chiamata in output è stata risolta
  • Nascondi tastiera morbida per perdere la messa a fuoco
  • <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.xyTestFragment" /> ...</LinearLayout> 

    La class di frammento I che sta testando con è:

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

    Notare che sto utilizzando il pacchetto di supporto pre-3.0 per i frammenti, portti in azione 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 ottiene sempre un savedInstanceState null, sia in onCreate() che in onActivityCreated() .

    Ho provato myFragment.setRetainInstance(true) nelle mie attività onCreate() , ma non ha cambiato nulla.

    Il mio onSaveInstanceState() ha un @Override, quindi so che non è qualcosa di stupido come un typo.

    Ho esaminato uno degli esempi ActionBarSherlock (com.actionbarsherlock.sample.shakespeare) e i frammenti che hanno i methods onSaveInstanceState() chiamati correttamente. Per quanto posso dire, questo esempio è scritto esattamente come il mio codice è – frammenti inclusi sia attraverso un layout che un layout XML. Ho anche costruito quel campione usando esattamente la stessa versione di ActionBarSherlock come il mio progetto principale sta utilizzando e il salvataggio dello stato di istanza funziona bene per questo esempio.

    Come posso mantenere i miei frammenti in stato di rotazione dello schermo? Perché non è chiamato onSaveInstanceState() ?

    2 Solutions collect form web for “Perché non sono chiamati i miei frammenti onSaveInstanceState ()?”

    Puoi abilitare myFragment.setRetainInstance(true) per mantenere lo stato, ma lo fa 'automaticamente', cioè mantiene i valori assegnati ai membri della tua class e NON utilizza onSaveInstanceState (e quindi salvatoInstanceState è sempre nullo).

    Assicurarsi che FragmentActivity che ospita questo frammento non onSaveInstanceState o quando lo fa dovrebbe call super.onSaveInstanceState(Bundle) .

    Se il frammento necessita di una risorsa di layout diversa quando viene ruotata, non può essere utilizzato setRetainInstance(true) . Questa pagina mostra il ciclo di vita del frammento con setRetainInstance(true) .

    L'idea originale è l'uso di onSaveInstanceState() per conservare tutti i dati dei membri, proprio come un'attività regolare. Tuttavia, per qualche motivo, onSaveInstanceState() non viene chiamato. Ma FragmentActivity è corretto, come ha suggerito @Eric Kok). La soluzione migliore che ho trovato è utilizzare Argomenti di Frammento.

    Vedi la soluzione di Fyodor Volchyok , è semplice. outState semplicemente come outState in onSaveInstanceState () e savedInstanceState in onViewCreated ().

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.