11

Ich begann vor ein paar Tagen mit Fragmenten, aber es scheint für mich verkabelt zu sein. Ich sehe den berechtigten Vorteil für die starke Zunahme der Komplexität nicht. Ich weiß nicht, ob ich die Funktionalität in meiner Aktivität oder in meinem Fragment implementieren sollte. Zuerst habe ich versucht, es in die Fragmente zu legen, aber das scheint oft nicht möglich zu sein.Fragmente scheinen übertrieben zu sein? Keine MVC-Architektur möglich?

Zum Beispiel: Ich habe einen Dialog als Benutzereingabe, nach dem Klicken der Taste. Also übertrug ich den Button Klick über Listener von Fragment zu Aktivität und in der Aktivität öffnete ich den Dialog. Im Dialog habe ich neue Funktionen gestartet (also Implementierung in Activity). Android Entwickler gibt den Hinweis, eine Warnmeldung in einem Fragment hinzuzufügen:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentAlertDialog.html

Aber dieses Fragment noch implementiert ist und schwer gekoppelt mit dem activty (Button-Aktion des Dialogs in der Tätigkeit ist).

Also Modell und View sind schwer durcheinander. Ich sehe keinen zusätzlichen Wert in solch einem schwer zu behaltenden, statischen Code ?!

Was ist Ihre Meinung und Rat zu Fragmenten?

+0

I don‘das Fragment Lifecycle lesen und verstehen Ich habe genug Erfahrung, um zu antworten, aber mein erster Durchlauf an Fragmenten ließ mich ihre Verwendung in Nicht-Tablet-Apps in Frage stellen. Definitiv eine Zunahme der Komplexität für eine bescheidene Verbesserung der UI-Entwicklung. – tcarvin

Antwort

23

Wenn Fragments verwenden, können Sie die View von ihnen als und die Activity als die Controller denken kann . Meiner Meinung nach war Fragments Googles Reaktion auf die Unterstützung von Tabletten, und jetzt stecken wir fest :(

Ich benutze Fragmente jeden Tag, und ich fühle sicherlich deine Schmerzen. Als ich zuerst über sie gelesen habe, dachte ich mir „das ist wirklich cool“, aber sie nach der Verwendung, sie in so vielerlei Hinsicht zu kurz, vor allem aber, weil ich sie falsch :(

Hier einige fallen, die ich gestoßen verwenden würde ...

  1. Verwenden Sie nicht onclick in Ihrem Fragment-Layout, da es die Activity und nicht dieist 10, die den Klick verarbeiten. Wenn Sie das Attribut verwenden und später das Fragment in einem anderen Activity verwenden, müssen Sie daran denken, auch die onclick-Methode zu dieser Activity hinzuzufügen. Verwenden Sie also eine findViewById und hängen Sie den Click-Handler dann manuell an die onCreateView des Fragments an.

  2. Wenn Sie mit anderen Fragmenten kommunizieren, verwenden Sie Activity als Controller, um die Nachricht zu leiten. (Viele Beispiele, wie dies mit Schnittstellen funktioniert). Der Schlüssel hier ist, dass wenn Sie mehrere Fragmente auf einem Gerät ausführen, wo ein Fragment direkt mit einem anderen Fragment kommuniziert, dann stoßen Sie auf ein seltsames, aber vorhersehbares Verhalten. Wenn zum Beispiel Fragment A direkt eine Ansicht in Fragment B aktualisiert, aber Fragment B nicht sichtbar ist (weil Sie es ersetzt haben - ein Telefon betrachten), dann wird View möglicherweise nicht aktualisiert, wenn Fragment B sichtbar ist View wird neu erstellt. Wenn Sie also eine Fragment aktualisieren, achten Sie darauf, die Daten in einem Fragment zu aktualisieren, dann aktualisieren Sie die View Teile in der onCreateView, die aufgerufen wird, wenn das Fragment wieder sichtbar wird (dh Sie haben das aktuelle Fragment, Sie zeigen jetzt die vorherige 1)

  3. Erstellen Sie keine vollständige Anwendung, die nur Fragmente verwendet. Stattdessen bilde Apps wie du normalerweise, mit Activities und dann behandelst die eine verherrlichte View (was es ist). dh, die App so zu gestalten, dass Sie mehrere Fragmente und mehrere Aktivitäten haben und einige Aktivitäten mehr als ein Fragment verwenden können.

Mein erster Gedanke mit Fragmenten war, wo ich es toll gedacht, nur eine komplette App zu bauen Fragmente und eine Aktivität mit ... Ich beendete schließlich die App, aber ich lief in so viele Probleme mit, dass Ansatz. Mein nächster Ansatz war, mehrere Fragmente und mehrere Aktivitäten zu verwenden, und es ging viel besser.

Unterm Strich ist, dass Fragmente groß sind, wenn man sie als View verwenden, aber wenn Sie versuchen, beginnen sie wie Aktivitäten zu verwenden, dann Sie gehen auf Probleme stoßen :(denken an die von Activiy ->Fragment als das Wesen die Controller ->View.

Ich empfehle auch, dass Sie neben dem Activity Lifecycle (Pro Android 4 hat ein großes Bild darzustellen, die sie), und Sie werden sich Stunden Schmerzen sparen :)

+0

Vielen Dank für Ihre Ratschläge. nach 1 .: Ich implementiere die onClickListeners im Fragment. Manchmal ändern Klicks nur das Fragment selbst. Zusätzlich dazu implementiere ich normalerweise eine öffentliche Listener-Schnittstelle in jedem Fragment und implementiere sie in der Aktivität, die das Fragment verwendet. Mit diesem Ansatz kann ich den onClicklistener über einen anderen Listener auf die Aktivität übertragen. Zunächst klingt das überladen, aber der Vorteil ist, dass ich die Ansichts-ID verwenden kann, um den Klick zu identifizieren und nur den Hörer in meiner Aktivität zu haben die UI-Elemente in meinem Fragment. –

+0

Gute Beschreibung und guter Rat. Irgendwie denke ich, wenn Views Layout-Dateien verwenden könnten, und wenn benutzerdefinierte Komponenten einfacher gemacht und gefördert würden, dann würden wir keine Fragmente benötigen. Wir könnten Activity == Controller, View == View haben. Aber irgendwie wurde das schon früh von den Android-Architekten vermisst. Als weitere bewährte Methode sollten Fragmente Klicks verarbeiten, Ereignisse ändern, Ereignisse berühren usw. Dann stellt das Fragment Listener bereit, die sich mehr wie Geschäftslogik lesen: AuthenticateUser, ShareMovie usw. Anschließend wird Ihre Aktivität von den Komponenten getrennt, die Sie zur Anzeige ausgewählt haben. – chubbsondubs

+0

https://github.com/square/mortar – dnkoutso

7

Fragmente bieten die Ansichtslogik, so dass sie zu anderen Aktivitäten portierbar sind. Die Aktivitäten bewegen sich mehr und mehr in der Rolle eines echten Controllers. In früheren Android-Architekturen wurde die View-Logik und die Controller-Logik zusammengemustert, weil niemand die Ansicht unterteilte, die meisten ihrer App zu implementieren. Sie haben im Wesentlichen Layout in den XML-Layoutdateien erstellt und dann die View-Objekte direkt in der Aktivität herausgezogen. Das bedeutet, dass die Aktivität Klick-Listener, Schlüssel-Listener, Drag-Logik usw. registriert hat, was normalerweise in einer anderen Unterklasse von View in anderen Toolkits der Fall ist. Weil sie das gemacht haben, bedeutete das, dass die coole Drag-Multi-Touch-Geste, die du gerade programmiert hast, in dieser einen Aktivität steckte. Jetzt möchten Sie das in einer anderen Aktivität erneut verwenden. Nun, du bist S.O.L. Mit Fragmenten können Sie diese Logik leichter von der Aktivität in ein Fragment verschieben. Jetzt können Sie es technisch in eine benutzerdefinierte Komponentenansicht verschieben, aber Fragments bieten noch einen weiteren Vorteil: Fragmente ermöglichen es Ihnen, Anwendungen zu schreiben, die auf Tablets und kleineren Geräten ausgeführt werden können, während Sie gleichzeitig das Layout variieren. Es ist schwierig zu verstehen, wie es funktioniert, aber eine einzelne Aktivität kann mehrere Fragmente mit unterschiedlichem Layout für jeden Formfaktor enthalten. Etwas, das eine benutzerdefinierte Komponente nicht so leicht erreichen kann. Außerdem können benutzerdefinierte Komponenten keine Layoutdateien verwenden. Sie müssen vollen Java-Code verwenden, etwas, das Sie nicht mit Fragmenten aufgegeben haben.

Ich denke, das Beispiel, das Sie zur Verfügung gestellt haben, ist ein schneller und dreckiger Ansatz zum Entwerfen von Fragmenten. Sie könnten genauso einfach die Rückreferenz (Verschachtelungsumfang davon) extrahieren, indem Sie eine Schnittstelle extrahieren, an die das Fragment delegiert.

-1

Ok, ich habe es mit mv Architektur läuft ...

public AlertDialog openLocInput() { 

    AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); 
    alert.setTitle("Login"); 
    alert.setMessage("Enter Pin :"); 

    // Set an EditText view to get user input 
    final EditText input = new EditText(getActivity()); 
    alert.setView(input); 

    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      jsonHandler.obtainMessage(1, input.getText().toString()) 
        .sendToTarget(); 
      dialog.dismiss(); 
      return; 
     } 
    }); 

    alert.setNegativeButton("Cancel", 
      new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        return; 
       } 
      }); 
    return alert.create(); 
} 

in Fragmente umgesetzt ... ab diesen Alertdialog von Fragmente:

 fragment_userlocation_btn_addLocation.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      openLocInput().setOwnerActivity(getActivity()); 
      openLocInput().show(); 
     } 
    }); 

auch in Fragmenten umgesetzt.

Aber ich glaube immer noch in der Theorie viel des Guten ...

Ich denke < 5% meiner UI wiederverwendet werden wird, wird es so empfohlen Fragmente und Aktivitäten einschließlich der ui Logik zu mischen Aktivitäten laden, ohne Fragmente?

Ich denke, der wahre Vorteil von Fragmenten ist Tablet-Optimierung, aber die Verwendung von Tablets verglichen mit der Verwendung von mobilen Geräten sind zu diesem Zeitpunkt sehr klein. Zusätzlich zu, dass Tabletten sind nicht so „mobile“ dann mobile Geräte und sind nicht im Fokus für kontextbewusste Entwicklung ...

+0

Das ist die Sache über die Wiederverwendung. Es ist schwer vorauszusagen, wann Sie es verwenden werden, da Sie nicht vorhersagen können, welche zukünftigen Anforderungen Sie haben werden. Genau wie viele Dinge im Leben, wenn Sie es zu lange ignorieren, haben Sie ein viel größeres Projekt auf Ihren Händen, als wenn Sie langsam kleinere Verbesserungen machen. Schneiden Sie Ihr Gras nicht für 10 Jahre im Vergleich zu schneiden Sie es alle 2 Wochen. Wenn Sie einen Plan haben, können Sie im Laufe der Zeit kleine Änderungen vornehmen, um Ihr Programm zu leiten. – chubbsondubs

Verwandte Themen