it-swarm.com.de

MVC-Muster auf Android

Ist es möglich, das Model-View-Controller-Muster in Java für Android zu implementieren?

Oder ist es bereits durch Aktivitäten implementiert? Oder gibt es eine bessere Möglichkeit, das MVC-Muster für Android zu implementieren?

491
Mohit Deshpande

In Android haben Sie keine MVC, aber Sie haben Folgendes:

  • Sie definieren Ihr Benutzeroberfläche in verschiedenen XML-Dateien nach Auflösung, Hardware usw.
  • Sie definieren Ihre Ressourcen in verschiedenen XML-Dateien nach Gebietsschema usw.
  • Sie erweitern Klassen wie ListActivity , TabActivity und verwenden die XML-Datei mit inflaters .
  • Sie können beliebig viele Klassen für Ihre Geschäftslogik erstellen.
  • Viele tils wurden bereits für Sie geschrieben - DatabaseUtils, Html.
237
Pentium10

Es gibt kein universell eindeutiges MVC-Muster. MVC ist eher ein Konzept als ein solides Programmiergerüst. Sie können Ihre eigene MVC auf jeder Plattform implementieren. Solange Sie sich an die folgende Grundidee halten, implementieren Sie MVC:

  • Modell: Was zu rendern
  • Ansicht: Wie wird gerendert?
  • Controller: Ereignisse, Benutzereingabe

Denken Sie auch so darüber nach: Wenn Sie Ihr Modell programmieren, muss sich das Modell nicht um das Rendern (oder den plattformspezifischen Code) kümmern. Das Modell würde zu der Ansicht sagen, es ist mir egal, ob Ihr Rendering Android oder iOS oder Windows Phone ist, das ist es, was Sie zum Rendern benötigen. Die Ansicht würde nur den plattformspezifischen Rendering-Code verarbeiten.

Dies ist besonders nützlich, wenn Sie Mono verwenden, um das Modell für die Entwicklung plattformübergreifender Anwendungen freizugeben.

225
Ramon Chan

Die Aktionen, Ansichten und Aktivitäten auf Android stellen die integrierte Arbeitsweise für die Android Benutzeroberfläche dar und sind eine Implementierung des Modell-Ansicht-Ansicht-Modells (MVVM)). pattern, das strukturell ähnlich ist (in derselben Familie wie) model-view-controller.

Nach meinem besten Wissen gibt es keine Möglichkeit, aus diesem Modell auszubrechen. Dies ist wahrscheinlich möglich, aber Sie verlieren wahrscheinlich den gesamten Nutzen, den das vorhandene Modell bietet, und müssen Ihre eigene Benutzeroberflächenebene neu schreiben, damit es funktioniert.

47
Derick Bailey

Nach einigem Suchen ist die vernünftigste Antwort die folgende:

MVC ist bereits in Android implementiert als:

  1. View = Layout, Ressourcen und eingebaute Klassen wie Button abgeleitet von Android.view.View.
  2. Controller = Aktivität
  3. Modell = die Klassen, die die Anwendungslogik implementieren

(Dies impliziert übrigens keine Anwendungsdomänenlogik in der Aktivität.)

Das Vernünftigste für einen kleinen Entwickler ist, diesem Muster zu folgen und nicht zu versuchen, das zu tun, was Google beschlossen hat.

PS Beachten Sie, dass Activity manchmal neu gestartet wird, sodass Modelldaten nicht gespeichert werden können. (Der einfachste Weg, einen Neustart zu veranlassen, besteht darin, Android:configChanges="keyboardHidden|orientation" in der XML-Datei auszulassen und das Gerät auszuschalten.).

BEARBEITEN

Wir sprechen vielleicht über MVC, aber es wird sozusagen FMVC, Framework - Model - View - Controller =. Das Framework (das Android-Betriebssystem) legt seine Idee des Komponentenlebenszyklus und verwandter Ereignisse fest, und in der Praxis das Controller (Activity/Service/BroadcastReceiver) ist zuallererst dafür verantwortlich, mit diesen Framework - auferlegten Ereignissen umzugehen (wie onCreate ()). Sollte die Benutzereingabe separat verarbeitet werden? Auch wenn dies der Fall sein sollte, können Sie es nicht trennen, Benutzereingabeereignisse stammen auch von Android.

Je weniger Code, der nicht Android-spezifisch ist, Sie in Ihr Activity/Service/BroadcastReceiver einfügen, desto besser.

29

Es gibt kein einzelnes MVC-Muster, dem Sie folgen könnten. MVC gibt nur mehr oder weniger an, dass Sie Daten und Ansicht nicht mischen sollten, so dass z. Ansichten sind dafür verantwortlich, Daten zu speichern, oder Klassen, die Daten verarbeiten, wirken sich direkt auf die Ansicht aus.

Bei der Art und Weise, wie Android mit Klassen und Ressourcen umgeht, sind Sie manchmal sogar gezwungen, dem MVC-Muster zu folgen. Komplizierter sind meiner Meinung nach die Aktivitäten, die manchmal für die Ansicht verantwortlich sind, aber trotzdem gleichzeitig als Controller fungieren.

Wenn Sie Ihre Ansichten und Layouts in den XML-Dateien definieren, Ihre Ressourcen aus dem Ordner res laden und vermeiden, diese Dinge mehr oder weniger in Ihren Code zu mischen, folgen Sie trotzdem einem MVC-Muster.

18

Sie können MVC in Android implementieren, es wird jedoch nicht "nativ unterstützt" und erfordert einige Anstrengungen.

Trotzdem tendiere ich persönlich dazu, MVP als viel saubereres Architekturmuster für die Android -Entwicklung zu verwenden. Und mit MVP meine ich:

enter image description here

Ich habe auch eine ausführlichere Antwort gepostet hier .

Nachdem ich mit den verschiedenen Ansätzen zur MVC/MVP-Implementierung in Android gespielt hatte, kam ich auf ein vernünftiges Architekturmuster, das ich in diesem Beitrag beschrieben habe: MVP- und MVC-Architekturmuster in Android .

14
Vasiliy

Die beste Ressource, die ich gefunden habe, um MVC auf Android zu implementieren, ist dieser Beitrag :

Ich habe für eines meiner Projekte das gleiche Design gewählt, und es hat großartig funktioniert. Ich bin ein Anfänger auf Android, daher kann ich nicht sagen, dass dies die beste Lösung ist.

Ich habe eine Änderung vorgenommen: Ich habe das Modell und den Controller für jede Aktivität in der Anwendungsklasse instanziiert, damit diese nicht neu erstellt werden, wenn sich der Querformat-Hochformat-Modus ändert.

14
Hervé Donner

Ich stimme JDPeckham zu und bin der Meinung, dass XML allein nicht ausreicht, um den UI-Teil einer Anwendung zu implementieren.

Wenn Sie jedoch die Aktivität als Teil der Ansicht betrachten, ist die Implementierung von MVC recht einfach. Sie können Anwendung (wie von getApplication () in Activity zurückgegeben) überschreiben und hier einen Controller erstellen, der die Lebensdauer Ihrer Anwendung überlebt.

(Alternativ können Sie das in der Anwendungsdokumentation vorgeschlagene Singleton-Muster verwenden.)

12
typingduck

Die Erstellung einer Android-Benutzeroberfläche unter Verwendung von Layouts, Ressourcen, Aktivitäten und Absichten ist eine Implementierung des MVC-Musters. Weitere Informationen finden Sie unter folgendem Link - http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

Spiegel für das pdf

11
Das

MVC-Architektur auf Android Es ist besser, jedem MVP statt MVC in Android zu folgen. Aber immer noch nach der Antwort auf die Frage kann dies eine Lösung sein

Enter image description here

Beschreibung und Richtlinien

     Controller -
        Activity can play the role.
        Use an application class to write the
        global methods and define, and avoid
        static variables in the controller label
    Model -
        Entity like - user, Product, and Customer class.
    View -
        XML layout files.
    ViewModel -
        Class with like CartItem and owner
        models with multiple class properties
    Service -
        DataService- All the tables which have logic
        to get the data to bind the models - UserTable,
        CustomerTable
        NetworkService - Service logic binds the
        logic with network call - Login Service
Helpers -
        StringHelper, ValidationHelper static
        methods for helping format and validation code.
SharedView - fragmets or shared views from the code
        can be separated here

AppConstant -
        Use the Values folder XML files
        for constant app level

HINWEIS 1:

Jetzt ist hier das Stück Magie, das Sie tun können. Nachdem Sie den Code klassifiziert haben, schreiben Sie eine Basisschnittstellenklasse wie IEntity und IService. Deklarieren Sie gängige Methoden. Erstellen Sie nun die abstrakte Klasse BaseService, deklarieren Sie Ihre eigenen Methoden und haben Sie eine Codetrennung.

HINWEIS 2: Wenn Ihre Aktivität mehrere Modelle enthält, ist es besser, die Ansichten in Fragmente zu unterteilen, als den Code/die Logik in Aktivität zu schreiben. Dann ist es besser. Wenn also in Zukunft ein weiteres Modell in der Ansicht angezeigt werden soll, fügen Sie ein weiteres Fragment hinzu.

HINWEIS 3: Die Trennung von Code ist sehr wichtig. Jede Komponente in der Architektur sollte unabhängig sein und keine abhängige Logik haben. Wenn Sie zufällig eine abhängige Logik haben, schreiben Sie dazwischen eine Mapping-Logikklasse. Dies wird Ihnen in Zukunft helfen.

10
DropAndTrap

Obwohl dieser Beitrag alt zu sein scheint, möchte ich die folgenden zwei hinzufügen, um über die jüngste Entwicklung in diesem Bereich für Android zu informieren:

Android-Bindung - Bereitstellung eines Frameworks, das die Bindung von Android Ansichtswidgets an das Datenmodell ermöglicht. Es ist hilfreich, MVC- oder MVVM-Muster in Android -Anwendungen zu implementieren.

roboguice - RoboGuice nimmt das Rätselraten aus der Entwicklung. Injizieren Sie Ihre Ansicht, Ressource, Systemdienst oder ein anderes Objekt, und lassen Sie RoboGuice die Details erledigen.

9
Mahendra Liya

Das MVC-Muster von Android wird (irgendwie) mit den Klassen Adapter implementiert. Sie ersetzen einen Controller durch einen "Adapter". Die Beschreibung für den Adapter lautet:

Ein Adapterobjekt fungiert als Brücke zwischen einer Adapteransicht und den zugrunde liegenden Daten für diese Ansicht.

Ich untersuche dies nur für eine Android Anwendung, die aus einer Datenbank liest, daher weiß ich noch nicht, wie gut sie funktioniert. Es scheint jedoch ein bisschen wie die Model-View-Delegate-Architektur von Qt zu sein, von der sie behaupten, sie sei ein Schritt weiter als ein herkömmliches MVC-Muster. Zumindest auf dem PC funktioniert Qts Pattern ziemlich gut.

9
Ben

Model View Controller (MVC)

enter image description here


Beschreibung:

  • Wenn wir große Projekte in die Softwareentwicklung einbeziehen müssen, wird MVC im Allgemeinen verwendet, da es eine universelle Art ist, die Projekte zu organisieren.
  • Neue Entwickler können sich schnell an das Projekt anpassen
  • Hilft bei der Entwicklung großer Projekte und plattformübergreifender Projekte.

Das MVC-Muster sieht im Wesentlichen so aus:

  • Modell: Was soll angezeigt werden. Dies kann die Datenquelle sein (Beispiel: Server, Rohdaten in der App)
  • Ansicht: Wie es angezeigt wird. Dies kann die XML sein. Es wirkt somit als Präsentationsfilter. Eine Ansicht wird an ihr Modell (oder Modellteil) angehängt und erhält die für die Präsentation erforderlichen Daten.
  • Controller: Ereignisse wie Benutzereingaben verarbeiten. Dies ist die Aktivität

Wichtiges Merkmal von MVC: Wir können entweder das Modell oder die Ansicht oder den Controller ändern, ohne die anderen zu beeinflussen

  • Nehmen wir an, wir ändern die Farbe in der Ansicht, die Größe der Ansicht oder die Position der Ansicht. Dies hat keine Auswirkungen auf das Modell oder den Controller
  • Angenommen, wir ändern das Modell (anstelle von Daten, die vom Server abgerufen werden, um Daten aus Assets abzurufen), es hat jedoch keine Auswirkungen auf die Ansicht und den Controller
  • Nehmen wir an, wir ändern den Controller (Logik in der Aktivität), dies hat keine Auswirkungen auf das Modell und die Ansicht
9
Devrath

Ich denke, die nützlichste vereinfachte Erklärung ist hier: http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

Nach allem, was ich hier gesehen und gelesen habe, erschwert die Implementierung all dieser Dinge und passt nicht gut zu anderen Teilen von Android.

Es ist bereits der Standard Android, eine Aktivität andere Listener implementieren zu lassen. Am harmlosesten wäre es, den Java - Beobachter wie auf den Folien beschrieben hinzuzufügen und die onClick-Aktionen und andere Arten von Aktionen in Funktionen zu gruppieren, die sich noch in der Aktivität befinden.

Der Android Weg ist, dass die Aktivität beides macht. Wenn Sie dagegen ankämpfen, wird das Erweitern oder Ausführen zukünftiger Codierungen nicht wirklich einfacher.

Ich stimme zu der 2. Beitrag . Es ist irgendwie schon implementiert, nur nicht so, wie die Leute es gewohnt sind. Unabhängig davon, ob es sich in derselben Datei befindet oder nicht, gibt es bereits eine Trennung. Es ist nicht erforderlich, eine zusätzliche Trennung zu erstellen, damit sie für andere Sprachen und Betriebssysteme geeignet ist.

7
Edmund Chang

Ich habe die MVx-Katastrophe auf Android satt. Vor kurzem habe ich eine winzige Bibliothek erstellt, die einen unidirektionalen Datenfluss bietet und dem Konzept von MVC ähnelt: https://github.com/zserge/ Amboss

Grundsätzlich haben Sie eine Komponente (Aktivität, Fragment und Ansichtsgruppe). Im Inneren definieren Sie die Struktur und den Stil der Ansichtsebene. Außerdem legen Sie fest, wie Daten an die Ansichten gebunden werden sollen. Schließlich können Sie Listener an denselben Ort binden.

Sobald Ihre Daten geändert wurden, wird die globale "render ()" - Methode aufgerufen und Ihre Ansichten werden intelligent mit den neuesten Daten aktualisiert.

Hier ist ein Beispiel für die Komponente, in der alles für die Code-Kompaktheit enthalten ist (natürlich können Modell und Controller leicht voneinander getrennt werden). Hier ist "count" ein Modell, view () - Methode eine Ansicht und "v -> count ++" ist ein Controller, der auf die Schaltfläche klickt und das Modell aktualisiert.

public MyView extends RenderableView {
  public MyView(Context c) {
      super(c);
  }

  private int count = 0;

  public void view() {
    frameLayout(() -> {              // Define your view hierarchy
      size(FILL, WRAP);
      button(() -> {
          textColor(Color.RED);      // Define view style
          text("Clicked " + count);  // Bind data
          onClick(v -> count++);     // Bind listeners
      });
    });
  }

Mit dem getrennten Modell und Controller würde es so aussehen:

button(() -> {
   textColor(Color.RED);
   text("Clicked " + mModel.getClickCount());
   onClick(mController::onButtonClicked);
});

Hier wird bei jedem Klick auf eine Schaltfläche die Zahl erhöht, dann "render ()" aufgerufen und der Schaltflächentext aktualisiert.

Die Syntax wird angenehmer, wenn Sie Kotlin verwenden: http://zserge.com/blog/anvil-kotlin.html . Es gibt auch alternative Syntax für Java ohne Lambdas.

Die Bibliothek selbst ist sehr leicht, hat keine Abhängigkeiten, verwendet keine Reflexion usw.

(Haftungsausschluss: Ich bin der Autor dieser Bibliothek)

5
zserge

Es war überraschend zu sehen, dass keiner der Beiträge hier die Frage beantwortete. Sie sind entweder zu allgemein, vage, falsch oder sprechen die Implementierung in Android nicht an.

In MVC kann der Layer View nur die Benutzeroberfläche anzeigen. Wenn dafür Daten benötigt werden, beziehen sie diese aus der Modell Ebene. Die Ansicht fordert das Modell jedoch NICHT direkt auf, die Daten zu finden, sondern über den Controller. Also ruft der Controller das Modell auf, um die erforderlichen Daten für den View bereitzustellen. Sobald die Daten fertig sind, informiert der Controller den View, dass die Daten vom Model erfasst werden können. Jetzt kann der View die Daten aus dem Model holen.

Dieser Ablauf kann wie folgt zusammengefasst werden:

enter image description here

Es ist erwähnenswert, dass der View über die Verfügbarkeit der Daten im Model informiert werden kann, entweder über Controller - auch bekannt als Passive MVC - oder durch Beobachtung der Daten im Modell durch Registrierung von Observablen Aktive MVC .

Was die Implementierung angeht, ist eines der ersten Dinge, die in den Sinn kommen, welche Android -Komponente für View verwendet werden sollte. Activity oder Fragment?

Die Antwort ist, dass es keine Rolle spielt und beide verwendet werden können. Das View sollte in der Lage sein, die Benutzeroberfläche (UI) auf dem Gerät darzustellen und auf die Interaktion des Benutzers mit der UI zu reagieren. Sowohl Activity als auch Fragment stellen hierfür die erforderlichen Methoden zur Verfügung.

In der in this article verwendeten Beispiel-App habe ich Activity für die Ebene View verwendet, aber Fragment kann auch benutzt werden.

Die vollständige Beispiel-App finden Sie im 'mvc'-Zweig meines GitHub-Repos hier .

Ich habe mich auch mit den Vor- und Nachteilen der MVC-Architektur in Android durch ein Beispiel befasst hier .

Für Interessierte habe ich eine Reihe von Artikeln zu Android app architecture hier gestartet, in denen ich die verschiedenen Architekturen, dh MVC, MVP, MVVM, für Android App-Entwicklung über eine vollständig funktionierende App.

5
Ali Nem

Es gibt keine implementierte MVC-Architektur, aber es gibt eine Reihe von Bibliotheken/Beispielen, um eine MVP-Architektur (Model-View-Presenter) zu implementieren.

Bitte überprüfen Sie diese Links:

Google hat ein Beispiel für ein MVP mit Android Architektur hinzugefügt:

4
carlos.baez

Ich habe gesehen, dass viele Leute sagen, MVC ist bereits in Android implementiert, aber es ist nicht wahr. Android folgt standardmäßig keiner MVC.

Weil ich es nicht tue, wird Google jemals die Einschränkungen einer MVC-Implementierung wie dem iPhone erzwingen, aber es liegt an den Entwicklern, welche Muster oder Techniken sie in ihrem Projekt haben wollen. In kleinen oder einfachen Anwendungen ist die Verwendung von MVC nicht erforderlich, sondern als Anwendung wächst und wird kompliziert und erfordert Änderungen des Codes in späteren Jahren, dann kommt die Notwendigkeit des MVC-Musters in Android.

Es bietet eine einfache Möglichkeit zum Ändern von Code und hilft auch bei der Reduzierung von Problemen. Wenn Sie MVC auf Android implementieren möchten, folgen Sie diesem Link und genießen Sie die MVC-Implementierung in Ihrem Projekt.

http://www.therealjoshua.com/2011/11/Android-architecture-part-1-intro/

Aber heutzutage denke ich, dass MVP zusammen mit Android Architectural Pattern eine der besten Optionen ist, die Entwickler für eine saubere und robuste Android Anwendung verwenden sollten.

3
Lucky Rana

Laut der Erklärung dass das Xamarin-Team erklärt hat (auf dem iOS MVC "Ich weiß, es scheint komisch, aber warte eine Sekunde"):

  • Das Modell (Daten- oder Anwendungslogik),
  • Die Ansicht (Benutzeroberfläche) und
  • Der Controller (Code dahinter).

Ich kann das sagen:

Das Modell auf Android ist einfach das paketfähige Objekt. Die Ansicht ist das XML-Layout und der Controller ist die (Aktivität + sein Fragment).

* Dies ist nur meine Meinung, nicht aus einer Quelle oder einem Buch.

3
zaPlayer

Wenn wir MVC, MVVM oder Presentation Model auf eine Android App anwenden, wollen wir wirklich ein klar strukturiertes Projekt und mehr wichtig einfacher für Unit-Tests.

Im Moment haben Sie ohne ein Framework von Drittanbietern normalerweise viel Code (wie addXXListener (), findViewById () usw.), der keinen geschäftlichen Nutzen bringt.

Außerdem müssen Sie Android Komponententests anstelle von normalen JUnit-Tests ausführen, deren Ausführung Ewigkeiten in Anspruch nimmt und die Komponententests etwas unpraktisch machen. Aus diesen Gründen haben wir vor einigen Jahren ein Open-Source-Projekt gestartet: RoboBinding - Ein datenbindendes Präsentationsmodell-Framework für die Plattform Android.

Mit RoboBinding können Sie UI-Code schreiben, der einfacher zu lesen, zu testen und zu warten ist. RoboBinding beseitigt die Notwendigkeit von unnötigem Code wie etwa addXXListener und verschiebt die UI-Logik zu Presentation Model, einem POJO, das über normale JUnit getestet werden kann Tests . RoboBinding selbst wird mit mehr als 300 JUnit-Tests ausgeliefert, um die Qualität sicherzustellen.

2
Cheng

Nach meinem Verständnis sieht die Art und Weise, wie Android mit dem MVC-Muster umgeht, folgendermaßen aus:

Sie haben eine Aktivität, die als Controller dient. Sie haben eine Klasse, die dafür verantwortlich ist, die Daten abzurufen - das Modell, und dann haben Sie die View-Klasse, die die View ist.

Wenn man über die Ansicht spricht, denken die meisten Leute nur an den visuellen Teil, der in der XML definiert ist. Vergessen wir nicht, dass die Ansicht auch einen Programmteil mit seinen Konstruktoren, Methoden usw. enthält, der in der Klasse Java definiert ist.

0
Rados