Frage

Dies ist eher eine Designfrage als eine technische.

Allgemeiner Fall: Ich möchte ein UI-Ereignis in einem Fragment, um Aktivitätsänderungen vorzunehmen.

Spezifischer Fall: Ich habe zwei Fragmente, die in derselben Aktivität gehostet werden. Wenn der Benutzer in einem dieser Fragmente auf eine Schaltfläche klickt, möchte ich, dass er durch das andere ersetzt wird.

ich will nicht, Meine Fragmente berühren jedoch meine Aktivität. Vielleicht möchte ich das Verhalten später ändern (vielleicht zeigen ich in einem größeren Bildschirm beide Fragmente anstatt das erste zu ersetzen), und ich möchte nicht, dass mein Fragmentcode diese Logik hat.

Was ich tat, war eine Implementierung eines Listener Klasse in meinen Fragmenten, die Ereignisse zurück an die berichten Activity. Auf diese Weise, wenn ich einen anderen benutzen möchte Activity Klasse mit unterschiedlichem Displayverhalten kann ich einfach den Hörer ändern und das verlassen Fragment Code unberührt.

Ist das ein guter Weg, um es zu tun? Gibt es eine Standardpraxis oder ein besseres Designmuster?

War es hilfreich?

Lösung

Die Verwendung von Zuhörern ist die empfohlene Art der Kommunikation zwischen Fragment und Ihrer Aktivität.

Sieh dir das an Android -Dokumentatinabschnitt Für die Befragung. Kurz gesagt, sie implementieren nur eine Hörerschnittstelle von der Aktivitätsklasse und gossen GetActivity () zu einem Fragment für einen Zuhörer.

Aus meiner persönlichen Erfahrung ist dies sehr bequem, da Sie:

  1. Easly Switch zugrunde liegende Aktivität (zB Sie hosten das gesamte Fragment in einer Wrapperaktivität für die Kompatibilität in Pre-3.0 und hosten dieses Fragment zusammen mit anderen in 11+)
  2. Einfachlöschliche Kontrolle, wenn die Wrapperaktivität Rückrufe unterstützt oder nicht. Überprüfen Sie nur, ob es den Hörer implementiert und Ihre App -spezifischen Aktionen ausführt, wenn dies nicht der Fall ist.

Andere Tipps

Sie haben Recht, einen Hörer zu verwenden. Dies ist etwas, mit dem ich mich auch in einem Projekt bei der Arbeit auseinandersetzen musste. Der beste Weg, um damit umzugehen, besteht darin, das Fragment in der Natur eigenständig zu machen. Alles, was mit dem Fragment interagieren möchte, sollte seine öffentliche API und/oder die Hörer für bestimmte Ereignisse einstellen. Wenn Sie mit vertraut sind Designmuster, Dies ist das Beobachtermuster. Die Ereignisse können allgemein oder spezifisch sein und Daten oder keine Daten enthalten.

Als Beispiel für mein Projekt hatte ich zwei Fragmente. Eine Listfragment und ein Infragment, das das ausgewählte ListItem angezeigt hat. Die Listfragment verfügt bereits über eine Hörerschnittstelle, in die sich meine Aktivität anschließt, aber die Infragment ist nicht, da es Ihr grundlegendes Fragment ist. Ich habe der Infragment eine Hörerschnittstelle hinzugefügt, die benachrichtigt wird, wenn das Fragment schließen wollte. Für das Fragment könnte dies durch eine Knopfdruck oder eine spezifische Aktion erfolgen, aber was meine Aktivität betrifft, würde es die Fragmentansicht schließen, wenn das Ereignis ausgelöst wird.

Haben Sie keine Angst, viele Zuhörer für Fragmente zu verwenden, sondern versuchen Sie auch, sie durch eine bestimmte Aktion zu gruppieren, indem Sie Datenparameter verwenden, um sie zu individualisieren. Hoffe das hilft!

Eine technische Antwort für:

Ich habe zwei Fragmente, die in derselben Aktivität gehostet werden. Wenn der Benutzer in einem dieser Fragmente auf eine Schaltfläche klickt, möchte ich, dass er durch das andere ersetzt wird.

    FragmentTransaction ft = this.getFragmentManager().beginTransaction();
    Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName());
    ft.replace(android.R.id.content, mFragment);
    ft.commit();
public class Example_3_Mainfile extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
         setContentView(R.layout.example_3_mainfile);

                 Fragment fr ;//make class that extend to thefragment 
                 fr = new Act_2_1();                 
                     FragmentManager fm = getFragmentManager();
                     FragmentTransaction fragmentTransaction = fm.beginTransaction();
                     fragmentTransaction.replace(R.id.fragment_place, fr);
                    //id get of fragment tag  from xml file there decelar
                     fragmentTransaction.commit();
                     }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top