9

I tutorial per sviluppatori Android mi consigliano di utilizzare le attività host dei frammenti per trasferire dati e quant'altro, quindi perché esiste un metodo set/get framment di destinazione?Dovremmo usare setTargetFragment()? Pensavo che i frammenti non dovessero comunicare l'uno con l'altro

La mia applicazione finora contiene un'attività di accoglienza, e un frammento, che ha un pulsante che lancia un DialogFragment, in cui v'è un pulsante che lancia un'altra DialogFragment. L'uso di setTargetFragment/getTargetFragment ha tuttavia reso questa confusione un po 'confusa, quindi sto pensando di reimplementare per consentire alla mia attività principale di gestire i metodi DialogFragment.show attraverso l'interfaccia personalizzata del mio frammento principale.

È questo il modo giusto di pensare? O non c'è nulla di male nell'uso di setTargetFragment? Qualcuno può fornire esempi buoni e cattivi di usarlo?

risposta

5

Non penso che ci sia un danno implicito nell'uso di setTargetFragment, tuttavia, lo userei solo in circostanze molto specifiche. Ad esempio, se il frammento di destinazione è , il frammento utilizzerà solo (prendendo in considerazione il riutilizzo degli oggetti e progettando le classi affinché siano riutilizzabili quando possibile) e anche in questo caso, con parsimonia.

Usandoli troppo, finirai con quello che stai vedendo - codice confuso che è difficile da seguire e mantenere. All'inizio, eseguendo il marshalling di tutto attraverso la tua attività, mantieni una gerarchia "piatta" che è semplice da seguire e mantenere.

Penso che la decisione di utilizzare setTargetFragment o no sia uno stile codificante/filosofico che, con saggezza ed esperienza, "sente" giusto o sbagliato. Forse sul tuo caso, con la prova che stai mettendo in discussione il tuo vecchio codice, stai guadagnando quella saggezza :)

+0

Suppongo che il mio coraggio mi dicesse di aver ragione. Grazie per i suggerimenti. Inizierò a reimplementare ora ...: P –

+1

Se si utilizza setTargetFragment tramite l'interfaccia di callback, non si accoppieranno i frammenti l'uno con l'altro - tuttavia se si esegue il cast su un frammento specifico, considererei una cattiva idea perché introduce accoppiamento. – AgentKnopf

6

Inoltre, si può finire con l'eccezione di nessun frammento di destinazione trovato nel gestore di frammenti. Ciò accade se dopo la rotazione (o altre modifiche di configurazione) il frammento di destinazione non verrà letto al gestore dei frammenti dal momento in cui il frammento del chiamante verrà aggiunto.

Immaginate di avere una sorta di frammento di conferma, che si aggiunge da MainFragment come così:

ConfirmationFragment frag = new ConfirmationFragment(); 
frag.setTargetFragment(this, 0); 
getFragmentManager().beginFragmentTransaction().add(R.id.container, frag).commit(); 

Ora su qualche tasto di conferma clic si richiama un metodo da MainFragment chiamando:

((MainFragment)this.getTargetFragment()).onUserSelectedGoodButton(); 

Questo è bello e semplice, ma se ruoterai lo schermo e per qualche motivo verrà aggiunto a FragmentManager prima del MainFragment, verrà generata un'eccezione, stat il frammento di destinazione non è stato trovato nel gestore frammenti

+0

Tutto ciò che devi fare è salvare il tuo frammento di destinazione in onSaveInstanceState - quindi puoi recuperarlo su onCreate se savedInstance è! = Null. Ricordo vagamente di aver letto, che se si sostituisce un frammento potrebbe essere problematico, piuttosto che nascondere quello originale e aggiungere il nuovo frammento sopra di esso. – AgentKnopf

Problemi correlati