2012-11-29 16 views
8

Ho alcuni problemi nel passare i dati da un'attività ai frammenti in esso. Ho cercato in giro ma non ho trovato una risposta adatta alla mia situazione. Ho 2 classe frammento denominata CurrentFragment.java e HistoryFragment.java. Li inizializzo come schede in un'attività.Come passare i dati dall'attività al frammento

Tab tab = actionBar.newTab() 
      .setText(R.string.tab_current) 
      .setTabListener(new TaskitTabListener<CurrentFragment>(
        this, "current", CurrentFragment.class)); 
    actionBar.addTab(tab); 

    tab = actionBar.newTab() 
      .setText(R.string.tab_history) 
      .setTabListener(new TaskitTabListener<HistoryFragment>(
        this, "history", HistoryFragment.class)); 
    actionBar.addTab(tab); 

mi è stato detto di usare setArguments in attività e getArguments nei frammenti. Ma in questa situazione come ottengo gli oggetti frammento nell'attività? Non riesco a utilizzare getFragmentManager().findFragmentById() poiché i frammenti vengono aggiunti a livello di codice.

Inoltre, trovo alcuni post che dicono che posso usare getActivity() in frammenti per accedere ai dati nel contenitore Attività, ma per me continua a restituire null. Qualcuno ha un esempio funzionante di questo?

+0

fa il getActivity() 'restituisce' 'null' in [onAttach] (http://developer.android.com/reference/android/support/v4/app/Fragment.html#onAttach%28android. app.Attività% 29) metodo? – svenkapudija

+0

Prova a setArguments in TaskitTabListener.onTabSelected(). – faylon

+0

@svenkapudija Sì, ritorna di nuovo in 'onAttach'. – OckhamTheRazor

risposta

7

[EDIT] Ho aggiornato la mia risposta per rispondere meglio alla tua domanda.

È anche possibile recuperare i frammenti per tag con getFragmentManager().findFragmentByTag("tag"). Attenzione però, se la scheda non è stata ancora visualizzata, il frammento non esisterà.

CurrentFragment curFrag = (CurrentFragment) 
    getFragmentManager().findFragmentByTag("current"); 
if(curFrag == null) { 
    // The user hasn't viewed this tab yet 
} else { 
    // Here's your data is a custom function you wrote to receive data as a fragment 
    curFrag.heresYourData(data) 
} 

Se si desidera che il frammento estragga i dati dall'attività, l'attività implementa un'interfaccia definita dal frammento. Nella funzione del ciclo di vita onAttach(Activity activity) per i frammenti è possibile accedere all'attività che ha creato il frammento in modo da poter trasmettere tale attività come l'Interfaccia definita e effettuare chiamate di funzione. Per fare che mettere l'interfaccia nel frammento come questo (È inoltre possibile rendere l'interfaccia di un proprio file se si desidera condividere la stessa interfaccia tra molti frammenti):

public interface DataPullingInterface { 
    public String getData(); 
} 

quindi implementare l'interfaccia nella vostra attività come questo:

public class MyActivity extends Activity implements DataPullingInterface { 
    // Your activity code here 
    public String getData() { 
     return "This is my data" 
    } 
} 

Infine nel metodo onAttach(Activity activity) nel CurrentFragment gettato l'attività si riceve come l'interfaccia è stato creato in modo da poter chiamare tali funzioni.

private DataPullingInterface mHostInterface; 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    if(D) Log.d(TAG, "onAttach"); 
    try { 
     mHostInterface = (DataPullingInterface) activity; 
    } catch(ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement DataPullingInterface"); 
    } 
    String myData = mHostInterface.getData();   
} 
+0

Grazie per la risposta, ma puoi spiegare cosa significa "un'interfaccia definita dal frammento"? – OckhamTheRazor

+0

Ho aggiornato la mia risposta perché non posso fare un bel codice nei commenti. Dai un'occhiata alla tua risposta. –

+0

Fantastico! Per me va bene. Grazie per l'aiuto. – OckhamTheRazor

Problemi correlati