2012-11-29 18 views
8

Ich habe einige Probleme beim Übergeben von Daten aus einer Aktivität an Fragmente darin. Ich suchte herum, fand aber keine Antwort, die meiner Situation gut entsprach. Ich habe 2 Fragmentklassen mit den Namen CurrentFragment.java und HistoryFragment.java. Ich initialisiere sie als Tabs in einer Aktivität.Wie Daten von Aktivität an Fragment übergeben werden

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); 

Mir wurde gesagt, setArguments in der Aktivität und getArguments in den Fragmenten zu verwenden. Aber wie bekomme ich in dieser Situation Fragmentobjekte in der Aktivität? Ich kann getFragmentManager().findFragmentById() nicht verwenden, da die Fragmente programmgesteuert hinzugefügt werden.

Außerdem finde ich einige Beiträge, die sagen, dass ich getActivity() in Fragmenten verwenden kann, um auf Daten im Aktivitätscontainer zuzugreifen, aber für mich wird es immer Null zurückgeben. Hat jemand ein funktionierendes Beispiel dafür?

+0

Hat die 'getActivity()' 'kehrt null' in [onAttach] (http://developer.android.com/reference/android/support/v4/app/Fragment.html#onAttach%28android. App.Aktivität% 29) Methode? – svenkapudija

+0

Versuchen Sie, in Ihrer TaskitTabListener.onTabSelected() -Argumente festzulegen. – faylon

+0

@svenkapudija Ja, es ruturns null in 'onAttach'. – OckhamTheRazor

Antwort

7

[EDIT] Ich habe meine Antwort aktualisiert, um besser auf Ihre Frage zu antworten.

Sie können Fragmente auch per Tag mit getFragmentManager().findFragmentByTag("tag") abrufen. Seien Sie jedoch vorsichtig, wenn das Register noch nicht angezeigt wurde, wird das Fragment nicht existieren.

Wenn das Fragment die Daten aus der Aktivität abrufen soll, implementieren Sie in Ihrer Aktivität eine Schnittstelle, die durch das Fragment definiert wird. In der Lebenszyklusfunktionfür Fragmente erhalten Sie Zugriff auf die Aktivität, die das Fragment erstellt hat, sodass Sie diese Aktivität als von Ihnen definierte Schnittstelle umsetzen und Funktionsaufrufe ausführen können. Um das zu tun, die Schnittstelle in Ihrem Fragmente so sagen (Sie können auch die Schnittstelle eine eigene Datei, wenn Sie die gleiche Schnittstelle unter vielen Fragmenten teilen mögen):

public interface DataPullingInterface { 
    public String getData(); 
} 

dann wie die die Schnittstelle in Ihrer Tätigkeit implementieren dies:

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

schließlich in Ihrem onAttach(Activity activity) Verfahren in CurrentFragment werfen die Aktivität, die Sie als Schnittstelle erhalten Sie erstellt, so dass Sie diese Funktionen aufrufen können.

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

Danke für die Antwort, aber können Sie erklären, was es bedeutet "eine Schnittstelle durch das Fragment definiert"? – OckhamTheRazor

+0

Ich habe meine Antwort aktualisiert, weil ich in Kommentaren keinen schönen Code schreiben kann. Überprüfen Sie es für Ihre Antwort. –

+0

Super! Das ist für mich in Ordnung. Danke für Ihre Hilfe. – OckhamTheRazor

Verwandte Themen