2017-05-01 5 views
0

Ich habe eine Aktivität und drei Fragmente. Die Anwendung startet und Fragment 1 ist sichtbar. Ich klicke auf einen Knopf. Das Fragment ist mit der Aktivität durch die folgende Schnittstelle und startet Fragment 2:Mehrere Fragmente mit einer Schnittstelle verwalten

public OnClickedListener listener; 

static interface OnClickedListener{ 
    public void buttonClicked(View v); 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 

    Activity a; 

    if (context instanceof Activity){ 
     a=(Activity) context; 
     this.listener = (OnClickedListener)a; 
    } 
} 

...

playBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listener.buttonClicked(v); } });

Mein MainActivity implementiert Fragment1.OnClickedListener, die Daten empfängt und startet Fragment 2.

Jetzt bin ich in Fragment 2. Ich möchte auf einen Knopf klicken und Fragment 3 starten. Ich weiß, dass ich das tun kann, indem ich noch eine andere Schnittstelle in Fragment 2 implementiere, um dann mit dem Gesetz zu kommunizieren tivity und sag "Hey Launch Fragment 3". So, jetzt sieht Meine Aktivität wie dieses

MainActivity implements Fragment1.OnClickedListener,Fragment2.OnClickedListener

Das ist alles in Ordnung, aber lassen Sie uns sagen, dass ich 20 Fragmente haben. Ich möchte nicht 20 Schnittstellen in meiner Hauptaktivität implementiert haben. Gibt es eine Möglichkeit, eine einzige Schnittstelle zu erstellen und zu verwenden, um zwischen jedem einzelnen Fragment und der Aktivität zu kommunizieren? Wie würde das umgesetzt werden? Vielen Dank.

Antwort

0

Sie können. Erstellen Sie nur eine Schnittstelle (Ich empfehle Ihnen, es in einer separaten Datei zu erstellen):

interface OnClickedListener { 
    void buttonClicked(Fragment fragment, View v); 
} 

Die onButtonClicked() Methode akzeptiert auch eine Fragment Instanz, wenn ein Button geklickt wird:

playBtn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // You can't use just "this", pass the class instance. 
     listener.buttonClicked(MyFragmentClassName.this, v); 
    } 
}); 

In Ihrem Activity werden Sie have so:

public class MainActivity extends Activity implements MainActivity.OnClickedListener { 
    @Override 
    public void buttonClicked(Fragment fragment, View v) { 
     // Check if the Fragment instance, or tag, or the info that you use to recognize it. 
    } 
} 
+0

Ich bin ein wenig verwirrt. Ich habe eine separate Schnittstelle namens OnClickedListener erstellt. Ich habe es in Fragment1 erweitert und bin in der Lage, die Daten zu erhalten, wenn auf die Schaltfläche geklickt wird: listener.buttonClicked (MyFragmentClassName.this, v); Wie bekomme ich das jetzt zu meiner Haupttätigkeit? Sie haben oben geschrieben, dass meine Hauptaktivität wie folgt aussehen sollte: public class MainActivity extends Activity implementiert MainActivity.OnClickedListener. Ich bin mir nicht sicher, was Sie hier implementieren? –

+0

Wie @mikhail sagte, deklariere die Schnittstelle in einer anderen Datei oder als verschachtelt in der MainActivity. –

0

Erstellen Sie eine verschachtelte Schnittstelle in Activity oder in einer separaten Datei anstelle von verschachtelten Schnittstellen in Fragmenten.

Verwandte Themen