2013-09-01 15 views
23

Ho provato a cercare ma sono ancora un po 'perso. Solitamente eseguo frammentazione per frammentare le comunicazioni attraverso un Activity tramite interfacce o uno BroadcastReceiver.Android - getTargetFragment e setTargetFragment - Che cosa sono utilizzati per

In ogni caso, la mia domanda è a che cosa serve getTargetFragment? Qualcuno può fornire un caso d'uso o un semplice esempio in modo da poterne comprendere l'utilizzo?

+1

http://stackoverflow.com/a/13733914/1093872 ecco un altro buon esempio ... ma anche le interfacce sono buone. –

+0

Grazie ... sembra solo un segnaposto per un frammento. quindi se ho un frammento e setTarget posso usare getTarget per recuperare il frammento. È simile a setTag sulle viste. – j2emanue

+1

Invece di BroadcastReceiver, è consigliabile utilizzare LocalBroadcastManager (qui: http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html) o creare il proprio meccanismo di gestione degli eventi. –

risposta

27

Use case = 2 frammenti ospitati dalla stessa attività.

Dove startActivityForResult() stabilisce una relazione tra 2 attività, setTargetFragment() definisce la relazione chiamante/chiamata tra 2 frammenti.

setTargetFragment (target) consente al frammento "chiamato" di sapere dove inviare il risultato. onActivityResult() viene chiamato manualmente in questo caso.

public class Caller extends Fragment 
    Fragment called = Called.newInstance() 
    called.setTargetFragment(this) 

public class Called extends DialogFragment 
    intent = amazingData 
    getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent) 
4

Da quello che sono stato in grado di togliere dalla lettura dei documenti era che questi metodi sono un altro modo di accedere ai dati da un altro frammento. Ecco uno sample project che ho scritto che dimostra un caso monouso per l'utilizzo di questi metodi. Sono sicuro che ci saranno più casi d'uso ...

+0

@ j2emanue quale parte non ottieni? –

4

ho finalmente scoperto come utilizzare setTarget in un frammento e volevo condividere. è abbastanza utile quando si desidera comunicare da un frammento all'altro.

Ecco un esempio: diciamo che volevi mostrare una finestra di dialogo e quando si chiude vuoi fare qualche azione.

Quindi nel tuo fragment1 che utilizzerà la finestra di dialogo che si potrebbe fare questo:

myDialogFragment.setTargetFragment(fragment1, myDialogFragment.REQ_CODE); 

e nel frammento che ha chiamato la finestra di dialogo si avrebbe bisogno di sovrascrivere onActivityResults in questo modo:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if(requestCode == CoDDialogFragment.REQ_CODE) 
      exit(); //or whatever you want to do here 
    } 

e nel myDialogFragment si potrebbe fare ciò:

TellTargetYouGotResults(REQ_CODE); 

//... 
    private void TellTargetYouGotResults(int code) { 
     Fragment targetFragment = getTargetFragment(); // fragment1 in our case 
     if (targetFragment != null) { 
      targetFragment.onActivityResult(getTargetRequestCode(), code, null); 
     } 
    } 

dove REQ_CO DE può essere qualsiasi int, ovviamente. Molto utile per la comunicazione tra frammenti e frammenti. ma preferisco comunque il bus degli eventi come a volte dopo aver inviato i dati a un target la cui vista potrebbe essere già stata distrutta (nel caso si tratti di un frammento) e quindi se si tenta di aggiornare la vista in onActivityResult si verificherà un arresto anomalo. quindi direi che è utile solo per passare i dati, ma non aggiornare l'interfaccia utente a meno che tu non abbia fatto una transazione frammento 'add' e non una sostituzione (che distrugge la vista ma mantiene lo stato).

Problemi correlati