2014-07-25 9 views
5

Quindi ho qui questo pezzo di codice, sto creando un nuovo frammento e lo sostituisco con un altro frammento. Funziona bene Tuttavia, ho notato che sulla prima riga viene chiamato il costruttore ma non lo sono il onAttach(), onCreate() ecc. Se dovessi decommentare la seconda riga, non funzionerà come updateItem(URL) richiede una visualizzazione Web avviata nella funzione onCreate().Sostituzione di frammenti in un'attività che non chiama onAttach, onCreate, onCreateView, ecc.

DetailViewFragment detailFragment = new DetailViewFragment(); 
//detailFragment.updateItem(URL); 
FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.displayList, detailFragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
ft.addToBackStack(null); 
ft.commit(); 

Apprezzerebbero qualsiasi aiuto che ottenga quello per lavorare con la seconda riga non commentato.

+0

Credo che onAttach, onCreate, ecc non vengano richiamati fino a quando il frammento non è stato impegnato per l'attività. Quindi dovrebbero essere chiamati sull'ultima riga di quel codice. Documenti Android sul ciclo di vita: http://developer.android.com/reference/android/app/Fragment.html#Lifecycle Hai provato a utilizzare ft.add (...)? –

risposta

1

Il onAttach(), onCreate(), ecc. Non verrà chiamato fino a quando lo FragmentManager ha effettivamente eseguito la modifica. Quindi, qualche tempo dopo commit() viene chiamato sulla transizione. Se è necessario passare l'URL allo Fragment dall'inizio, aggiungerlo al bundle dell'argomento del frammento prima del e chiamare commit(). Quindi sarai in grado di accedere all'URL nel tuo onCreate() o in altri metodi del ciclo di vita. Così si vorrà qualcosa di simile:

DetailViewFragment detailFragment = new DetailViewFragment(); 
Bundle args = new Bundle(); 
args.putString(DetailViewFragment.INIT_URL, URL); 
detailFragment.setArguments(args); 
ft.replace(R.id.displayList, detailFragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
ft.addToBackStack(null); 
ft.commit(); 

Ora nel tuo onCreate() è possibile chiamare per ottenere il fascio e recuperare l'URL che è stata approvata con la vostra attività.

3

API di livello 23 onAttach(Context context) opere
API Livello 22 onAttach(Activity activity) opere

Implementazione di entrambi i metodi ha funzionato per me:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
} 
0

Un'altra soluzione potrebbe essere quella di chiamare getSupportFragmentManager().executePendingTransactions(); solo dopo il commit. Attenzione che la trascrizione sarà sincrona allora.

Problemi correlati