2014-11-08 12 views

risposta

2

Il pacchetto ricevuto in onCreate contiene i dati forniti più recentemente se l'attività è stata ricreata e getArguments Bundle restituisce il pacchetto che è stato fornito come argomento.

1

Il bundle di argomenti utilizzato per la creazione di frammenti e una volta impostato non può essere impostato nuovamente. Il bundle in onCreate/onCreateView/onActivityCreated/onViewStateRestored è il parametro SavedInstanceState. È possibile utilizzare questo ottenere i valori persistenti persistono tramite sostituzioni onSaveInstanceState. Al momento della creazione del frammento, il pacchetto savedInstanceState è in genere null, quindi è possibile utilizzare getArguments.

Un'altra cosa sui getArguments, non è necessario mantenere questi valori. Verranno ricreati per te dal fragment code. Se si tenta di setArguments su un frammento che li ha già si esegue in un IllegalStateException

19

TL; DR:

Fragment.getArguments() serve a creare inizialmente un frammento.

onCreate (pacchetto) è per il recupero del pacchetto da un'istanza precedente.

In dettaglio:

Sono stato purga il web per questo e ha chiesto uno sviluppatore Android stagionato, ecco una spiegazione decente:

Il Bundle passato come parametro nella onCreate la funzione è valida se è presente un'istanza precedente di Fragment, che viene aggiornata quando viene chiamata la funzione onSaveInstanceState. (si può leggere di più su questo nella documentazione ufficiale qui: https://developer.android.com/training/basics/activity-lifecycle/recreating.html)

I Fragment.getArguments() funzione tuttavia, viene utilizzato quando inizialmente la creazione del frammento. Stai per navigare su un frammento per la prima volta e un'istanza precedente di quel frammento non esiste. In questo caso, è possibile impostare le variabili locali all'interno del frammento che è stato condiviso utilizzando le funzioni setArguments() & getArguments(). (più su quello qui: https://developer.android.com/reference/android/app/Fragment.html)

Pertanto: codice robusto potrebbe essere la seguente:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) 
{ 
    super.onCreateView(inflater, container, savedInstanceState); 

    mView = inflater.inflate(R.layout.fragment_name, container, false); 
    mContext = getActivity(); 

    if(savedInstanceState != null){ 
     Log.d("yourapp", "A SavedInstanceState exists, using past values"); 
     mValue = savedInstanceState.getString("valueString"); 
    }else{ 
     Log.d("yourapp", "A SavedInstanceState doesn't exist"); 
     Bundle bundle = getArguments(); 
     mValue = bundle.getString("valueString"); 
    } 
} 

che gestisce entrambi i casi nel vostro stato onCreate.

Spero che questo aiuti!

1

Desidero aggiungere alla risposta N15M0_jk. A volte non è necessario salvare lo stato dei frammenti (per i frammenti statici) e si può utilizzare solo per la ricreazione poiché gli argomenti impostati con setArguments() vengono mantenuti anche dopo la distruzione.

vedere il riferimento sulla setArguments()

+0

Grazie, hai risolto il mio mal di testa, non sapevo perché onSaveInstanceState era inutile! – Burrich

Problemi correlati