Antwort

17

Eine gute Lösung wäre, den SAME OnFragmentInteractionListener für alle Fragmente zu verwenden und einen Param jeder Listener-Methode (wie einen TAG-Parameter) zu verwenden, um zu ermitteln, welches Fragment die Aktion gesendet hat.

Hier ein Beispiel:

Erstellen Sie eine neue Klasse und jedes Fragment verwenden diese Klasse

OnFragmentInteractionListener.java

public interface OnFragmentInteractionListener { 
    public void onFragmentMessage(String TAG, Object data); 
} 

In Ihrer Tätigkeit:

public void onFragmentMessage(String TAG, Object data){ 
    if (TAG.equals("TAGFragment1")){ 
     //Do something with 'data' that comes from fragment1 
    } 
    else if (TAG.equals("TAGFragment2")){ 
     //Do something with 'data' that comes from fragment2 
    } 
    ... 
} 

Sie verwenden können Objekttyp, um jede Art von Daten zu übergeben, die Sie möchten (in jedem Fall) y if, müssen Sie Object in den Typ konvertieren, der notwendig war).

Auf diese Weise ist die Wartung einfacher als 6 verschiedene Listener und eine Methode für jede Art von Daten, die Sie übergeben möchten.

Hoffe, das hilft.

5

Mein Versuch neonamu's answer Verbesserung:

Sie eine Schnittstelle wie oben angegeben definieren kann, aber ein generisches

public interface OnListFragmentInteractionListener<T> { 

     void onListFragmentInteraction(String tag, T data); 
} 

Dann in der Aktivität Host Sie es speziell für den Typ implementieren können Sie wollen, oder wie oben für Object empfohlen:

Auf diese Weise, wenn Sie die Schnittstelle je nach den Anforderungen Ihrer Anwendung vielleicht implementieren Sie können diese Schnittstelle in einer anderen Situation wiederverwenden.

+1

Funktioniert wie ein Charme. Danke vielmals! –

+0

Ich habe mich gefragt, warum Sie @Override verwenden und Benutzer Neonamu nicht. Arbeiten beide? – Burkely91

+1

@ Burkely91 ja es wird ohne es funktionieren.BUT Sie sollten es verwenden. Die Override-Annotation in Java soll eine Überprüfung/Verifizierung sein, dass Sie tatsächlich die Überschreibung durchführen, die Sie für richtig halten (es wird einen Fehler melden, wenn Sie beispielsweise einen Parameter vergessen), ohne Override würden Sie einfach eine neue Methode definieren mit dem gleichen Namen verschiedene Parameter (eine Überladung) und nicht die Schnittstelle implementieren – HenriqueMS