Android上的MVC模式

是否有可能在Java中为Android实现模型 – 视图 – 控制器模式?

还是已经通过活动实施? 还是有更好的方式来实现Android的MVC模式?

在Android中你没有MVC,但你有以下几点:

  • 您可以通过分辨率,硬件等在各种XML文件中定义您的用户界面 。
  • 您可以通过语言环境等在各种XML文件中定义资源
  • 你扩展类如ListActivity , TabActivity和使用的inflaters的XML文件。
  • 您可以根据自己的业务逻辑创build任意数量的类。
  • 很多Utils已经为你写了 – DatabaseUtils,Html。

没有普遍唯一的MVC模式。 MVC是一个概念,而不是一个坚实的编程框架。 你可以在任何平台上实现自己的MVC。 只要你坚持以下基本思想,你正在实现MVC:

  • 模型:呈现什么
  • 查看:如何渲染
  • 控制器:事件,用户input

也可以这样思考:在编写模型时,模型不需要担心渲染(或特定于平台的代码)。 模型会对视图说,我不在乎你的渲染是Android还是iOS或Windows Phone,这就是我需要你渲染的东西。 该视图将只处理平台特定的渲染代码。

当您使用Mono来共享模型以开发跨平台应用程序时,这是特别有用的。

Android上的动作,视图和活动是与Android UI一起工作的一种方式,是模型 – 视图 – 视图模型(MVVM)模式的一个实现,它在结构上与模型视图-controller。

据我所知,没有办法摆脱这种模式。 它可能可以完成,但是你可能会失去现有模型的所有好处,并且必须重写自己的UI层才能使其工作。

经过一番search,最合理的答案是:

Android中已经实现了MVC:

  1. 视图=布局,资源和内置的类,如从android.view.View派生的Button
  2. Controller = Activity
  3. Model =实现应用程序逻辑的类

(顺便说一下,这个活动中没有应用程序域逻辑。)

对于一个小开发者来说,最合理的就是遵循这个模式,而不是试图去做Google决定不做的事情。

PS请注意,Activity有时会重新启动,因此它android:configChanges="keyboardHidden|orientation"用于模型数据(导致重新启动的最简单方法是从XML中省略android:configChanges="keyboardHidden|orientation"并closures设备)。

编辑

我们可能正在谈论MVC ,但FMVC框架 – 模型 – 视图 – 控制器将是如此。 框架 (Android OS)强加了组件生命周期和相关事件的概念,实际上ControllerActivity / Service / BroadcastReceiver )首先负责处理这些框架事件(例如onCreate() ) 。 用户input是否需要单独处理? 即使它应该,你不能分开它,用户input事件也来自Android。

无论如何,你放在你的Activity / Service / BroadcastReceiver中的代码越less越好。

没有单一的MVC模式,你可以服从。 MVC只是说或多或less地说,你不应该混合数据和视图,以便例如视图负责保存正在处理数据的数据或类直接影响视图。

但是,Android处理类和资源的方式,有时甚至被迫遵循MVC模式。 在我看来,更复杂的是有时候为这个观点负责的活动,但是同时也是一个控制者。

如果你在XML文件中定义你的视图和布局,从res文件夹加载你的资源,如果你或多或less地把这些东西混合在你的代码中,那么你无论如何都会遵循一个MVC模式。

我发现在Android上实现MVC的最佳资源是这个职位 :

我为我的一个项目采用了同样的devise,而且效果很好。 我是Android的初学者,所以我不能说这是最好的解决scheme。

我做了一个修改:我为应用程序类中的每个活动实例化模型和控制器,以便在横向模式更改时不会重新创build这些模型和控制器。

我同意JDPeckham的观点,我相信XML本身并不足以实现应用程序的UI部分。

但是,如果将Activity看作视图的一部分,那么实现MVC就相当简单。 您可以覆盖Application (由Activity中的getApplication()返回),在这里您可以创build一个在应用程序的整个生命周期内都能存活的控制器。

(或者你可以使用应用程序文档build议的单例模式)

使用布局,资源,活动和意图创buildAndroid UI是MVC模式的实现。 有关详情,请参阅以下链接 – http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

为PDF的镜像

你可以在Android中实现MVC,但它不是“本地支持”,需要付出一些努力。

这就是说,我个人倾向于MVP作为一个更清洁的Android开发架构模式。 而通过说MVP我的意思是:

在这里输入图像描述

我也在这里发布了更详细的答案。

在Android中使用MVC / MVP实现的各种方法后,我提出了一个合理的架构模式,我在这篇文章中描述了: Android中的MVP和MVC架构模式 。

虽然这篇文章看起来很老了,但我想补充以下两篇文章来介绍Android在这方面的最新进展:

android-binding – 提供一个框架,将android视图窗口小部件绑定到数据模型。 它有助于在android应用程序中实现MVC或MVVM模式。

roboguice – RoboGuice把发展的猜测。 注入视图,资源,系统服务或任何其他对象,让RoboGuice处理细节。

在Android上的 MVC 架构 它更好地遵循任何MVP而不是在Android MVC。 但仍然根据问题的答案这可以解决

在这里输入图像说明

说明和指导

  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 

注1:

现在,这是你可以做的一块魔法。 一旦你分类了这段代码,写一个像IEntity和IService这样的基本接口类。 声明通用的方法。 现在创build抽象类BaseService,并声明你自己的一套方法并分离代码。

注2:如果您的活动呈现多个模型,而不是在活动中编写代码/逻辑,最好将视图分割成片段。 那好吧。 所以在未来如果需要在视图中显示更多模型,请再添加一个片段。

注3:分离代码非常重要。 架构中的每个组件都应该是独立的,不依赖于逻辑。 如果偶然的话,如果你有一些依赖逻辑,然后写一个映射逻辑类之间。 这将在未来帮助你。

Android的MVC模式是(类)与他们的适配器类实现。 他们用一个“适配器”代替了一个控制器。 适配器说明如下:

Adapter对象充当AdapterView和该视图底层数据之间的桥梁。

我只是看着这个从数据库读取的Android应用程序,所以我不知道它有多好。 不过,它看起来有点像Qt的Model-View-Delegate架构,他们声称它是从传统的MVC模式中走出来的。 至less在个人电脑上,Qt的模式工作得很好。

模型视图控制器(MVC)

在这里输入图像描述


描述:

  • 当我们必须在软件开发中主要负责大型项目时,通常使用MVC,因为这是组织项目的普遍方式。
  • 新开发人员可以快速适应项目
  • 有助于开发大型项目并跨平台。

MVC模式本质上是这样的:

  • 模型:显示什么。 这可以是数据源(例如:应用程序中的服务器,原始数据)
  • 查看:如何显示。 这可以是XML。 因此它是一个演示filter。 视图附加到其模型(或模型部分),并获取演示所需的数据。
  • 控制器:处理用户input等事件。 这是活动

MVC的重要特点: 我们可以修改模型或视图或控制器仍然不会影响其他的

  • 假设我们改变视图中的颜色,视图的大小或视图的位置。 这样做不会影响模型或控制器
  • 假设我们改变模型(而不是从服务器获取的数据从资产中获取数据),它仍然不会影响视图和控制器
  • 说我们改变控制器(在活动中的逻辑)它不会影响模型和视图

我认为最有用的简单解释是在这里: http : //www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

从我看过的所有其他东西中,读到这里,实现所有这些东西使得它变得更加困难,并且与android的其他部分不兼容。

有一个活动实现其他监听器已经是标准的Android方式。 最无害的方法是像幻灯片描述那样添加Java Observer,并将onClick和其他types的动作分组到仍然在Activity中的函数中。

Android的方式是活动都是。 对抗它并不是真的使扩展或做未来的编码更容易。

我同意第二篇文章 。 这是已经实施,而不是人们习惯的方式。 无论是否在同一个文件,已经分离。 没有必要创build额外的分离,以使其适合其他语言和操作系统。

厌倦了Android上的MVx灾难我最近做了一个小型库,提供单向数据stream,类似于MVC的概念: https : //github.com/zserge/anvil

基本上,你有一个组件(活动,片段和视图组)。 在里面定义视图层的结构和风格。 你也定义了如何将数据绑定到视图。 最后,你可以在同一个地方绑定监听器。

然后,一旦你的数据被改变 – 全局的“render()”方法将被调用,你的视图将被智能地更新最新的数据。

下面是组件的一个例子,里面的代码紧凑(当然模型和控制器可以很容易地分开)。 这里“count”是一个模型,view()方法是一个视图,而“v – > count ++”是一个监听button点击并更新模型的控制器。

 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 }); }); } 

使用分离的模型和控制器,它看起来像:

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

在每个button上单击该数字将被增加,然后“render()”将被调用,并且button文本将被更新。

如果您使用Kotlin,语法会变得更愉快:http: //zserge.com/blog/anvil-kotlin.html 。 而且,没有lambdaexpression式的Java也有其他的语法。

库本身非常轻量级,没有依赖关系,不需要reflection等等。

(免责声明:我是这个库的作者)

我已经看到很多人都说MVC已经在Android中实现,但事实并非如此。 Android默认不遵循MVC。

因为Google不喜欢强制施加像iPhone一样的MVC实现的限制,但是他们已经把这个决定留给了用户使用MVC技术,因为在小的或者简单的应用中,我们不需要使用MVC,而是作为应用程序变得复杂,在开发完成后需要修改代码,那么就需要Android中的MVC模式。

它提供了一个简单的方法来修改代码,也有助于避免不必要的问题。 这些来自简单的Androiddevise模式。 如果你想在Android上实现MVC,那么按照下面给出的链接,在你的项目中享受MVC的实现技巧。

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

根据Xamarin团队的解释(在iOS MVC上“我知道这很奇怪,但稍等一下”):

  • 模型(数据或应用程序逻辑),
  • 视图(用户界面)和
  • 控制器(后面的代码)。

我可以这样说:

Android上的模型简直就是可以分类的对象。 该视图是XML布局,控制器是(活动+其片段)。

*这只是我的意见,不是来自任何资源或书籍。

没有实现的MVC体系结构,但是存在一组库/实例来实现MVP(模型 – 视图 – 演示者)体系结构。

请检查这些链接:

Google增加了一个Android架构MVP的例子:

当我们将MVC, MVVM或Presentation Model应用到Android应用程序时,我们真正想要的是有一个清晰的结构化项目,更重要的是unit testing。

目前,如果没有第三方框架,通常会有许多代码(如addXXListener(),findViewById()等),这些代码不会增加任何业务价值。

更重要的是,你必须运行Androidunit testing,而不是正常的JUnittesting,这需要很长时间才能运行,并使unit testing有些不切实际。 由于这些原因,几年前我们开始了一个开源项目RoboBinding – Android平台的数据绑定表示模型框架。

RoboBinding可以帮助您编写更容易阅读,testing和维护的UI代码。 RoboBinding消除了像addXXListener不必要的代码的需要,并将UI逻辑转换为Presentation Model,这是一个POJO,可以通过正常的JUnittesting进行testing 。 RoboBinding本身带有300多个JUnittesting,以确保其质量。

MVC模型

Android中的模型 – 视图 – 控制器在2011年左右,当Android开始变得越来越stream行时,架构问题自然就出现了。 由于MVC是当时最stream行的UI模式之一,开发者也试图将其应用于Android。

模型模型表示一组描述业务逻辑(即业务模型)和数据访问操作(即数据模型)的类。 它还定义了数据的业务规则意味着数据如何被改变和操纵。

视图视图表示UI组件。 它只负责显示从控制器收到的数据。 这也将模型转换成UI。

控制器控制器负责处理传入的请求。 它通过View接收来自用户的input,然后在Model的帮助下处理用户的数据并将结果传回给View。 通常,它充当View和Model之间的协调者。

换句话说

模型:内容提供者。 数据pipe理器是推荐的应用程序间数据共享forms。

观点:活动。 这是应用程序的主要用户界面组件。 Android应用程序的每个单独屏幕都是从Activity Java类(android.app.Activity)派生而来的。 他们是视图(android.view.View)的容器。

控制器:服务。 这些背景组件的行为与UNIX守护进程和Windows服务相似。 他们无形地运行并执行正在进行的无人值守处理。