2017-06-05 21 views
0

Ich habe gesucht und nicht gefunden, den besten Weg für verschachtelte Fragmente mit Elternfragment zu kommunizieren. In der Android-Dokumentation heißt es:Parent-Fragment zu Child Fragment-Kommunikation

Die gesamte Fragment-zu-Fragment-Kommunikation erfolgt über die zugehörige Aktivität. Zwei Fragmente sollten niemals direkt kommunizieren.

Angenommen, ich habe eine Galerie-App gibt es ein ViewPagerFragment (Eltern) und ImageFragment (Kind), die verwendet wird, um Bilder Vollbild anzuzeigen, wenn sie angeklickt wird. Ich muss eine ArrayList von Dateien von meinem Elternfragment an das Kindfragment übergeben. Was ist ein richtiger Weg, es zu tun?

1) Erstellen Sie einen Getter für das Arraylist in Elternfragment und verwenden Sie die getParentFragment() in einem Kind Fragment diese Methode zugreifen?

2) Implementieren Sie eine Schnittstelle und gehen Sie durch die Aktivität, aber wie finde ich das Kindfragment von der Aktivität, wenn es keine ID hat?

3) Nutzen Sie diese in Elternfragment:

ChildFragment fragment =(ChildFragment)getChildFragmentManager().findFragmentById(R.id.child_fragment_id);

Und nur einen Setter in Kindfragment verwenden.

Aber wieder wie bekomme ich die ID des childFragment?

jeder Vielen Dank im Voraus

Antwort

1

Ich verstehe, dass das Fragment Kommunikation durch die Aktivität Fragment Fragmente für Geschwister, die durch die gleiche Tätigkeit koordiniert werden.

In diesem Fall werden die siblign Fragmente von einem Elternfragment koordiniert, so würde ich sagen, dass die Kommunikation durch das Elternfragment verwaltet werden sollte.

Wenn Sie direkt mit den Fragmenten arbeiten, verwenden Sie den ChildFragmentManager().

Wenn Sie mit einem ViewPager arbeiten, übergeben Sie den ChildFragmentManager an den ViewPager, anstatt ihn an den FragmentManager zu übergeben.

Wenn Sie eine Liste übergeben müssen, denke ich, dass das ChildFragment es am einfachsten anfordert, wenn es bereit ist, es zu empfangen, indem eine Methode auf dem ParentFragment aufruft. Es kann immer mit getParentFragment() bekommen.

Ich bin mir nicht sicher, wo der sicherste Ort ist, getParentFrament() aufzurufen, um die Liste zu erhalten, aber Sie können onCreateView() in onActivityCreated() versuchen, o in onResume().

Um die Methode aufzurufen, die die Liste zurückgibt, können Sie das übergeordnete Fragment in die von Ihnen erweiterte Fragmentklasse umwandeln, oder Sie können eine Schnittstelle mit der Methode definieren, die die Liste zurückgibt und das erweiterte übergeordnete Fragment implementiert .

Dann verweisen Sie im untergeordneten Fragment auf die übergeordnete Schnittstelle, um die Methode aufzurufen und die Liste abzurufen.

+0

So gibt eigentlich keine Standardmethode? Die Verwendung von Schnittstellen hat keinen Vorteil gegenüber der Verwendung von getParent()? – LieForBananas

+0

Die Verwendung von Schnittstellen ist sauberer und flexibler, da das untergeordnete Fragment die Liste von jedem übergeordneten Fragment abrufen kann, ohne seine spezifische Klasse zu kennen oder es sogar von einer Aktivität zu erhalten. Die einzige Bedingung ist, dass das Parent Fragment/Activity die Schnittstelle implementiert. – Juan

+0

Vielen Dank für die Erklärung! Ich ging mit getParent() Methode, aber ich denke, ich werde eine Schnittstelle implementieren! – LieForBananas

0

Daten sollten mit Hilfe von Bundle als Argumente an Fragmente übergeben werden. So übergeben Sie einfach die Arraylist (serialisiert oder anders) zu Ihrem Kind Fragment beim Start

+0

Aber ist es eine absolute Notwendigkeit? Die Klasse File implementiert Serializable, also muss ich sie benutzen, aber ist es nicht langsamer als einfach auf einen Elternteil von getParent() zuzugreifen? – LieForBananas

1

Wenn Sie mit Ihrem Kind Fragment zu Ihrem Elternteil Fragment kommunizieren möchten, können Sie getParentFragment() Methode von Ihrem Kind-Fragment verwenden.

Beispiel

public class ParentFragment extends Fragment { 

    public int getCount() { 
     return 10; 
    } 
} 

public class ChildFragment extends Fragment { 


    void doAction() { 
     Fragment parentFragment = getParentFragment(); 

     if(parentFragment instanceof ParentFragment) { 
      int count = ((ParentFragment) parentFragment).getCount(); 
     } 
    } 
} 
+0

Vielen Dank für die Antwort! Ich habe eine andere Antwort hochgeladen, aber ich habe auch Ihren Code verwendet. Danke noch einmal! – LieForBananas