Android上的MVC模式

Moh*_*nde 493 java model-view-controller android design-patterns

是否可以在Java for Android中实现模型 - 视图 - 控制器模式?

或者它是否已通过活动实施?或者有更好的方法来实现Android的MVC模式?

Pen*_*m10 239

在Android中你没有MVC,但你有以下内容:

  • 您可以通过分辨率,硬件等在各种XML文件中定义用户界面.
  • 您可以按区域设置等在各种XML文件中定义资源.
  • 您延长clases就像ListActivity,TabActivity并利用XML文件的inflaters.
  • 您可以根据业务逻辑创建任意数量的类.
  • 很多Utils已经为你编写了 - DatabaseUtils,Html.

  • "在Android中你没有MVC"???? 在Android中,和其他语言一样,如果你想要MVC,你就拥有了MVC. (12认同)
  • 对于那些说"Android是MVC"的人,请尝试Backbone.js(是的,客户端js)一个星​​期,然后回来说"Android是MVC".你终于明白了这个问题以及为什么我们一直在问:) (8认同)
  • @JDPekham,你为什么说"你不能在没有与你的布局/视图交谈的情况下实例化一个活动"?实例化活动不需要与视图交谈,实际上与视图的交谈决不是活动实例化的一部分.您可以(但不必)在您认为合适时调用与您的视图交互的各种Activity方法.第二个问题:假设活动旨在扮演"控制器"角色(我相信很多Android开发者都是这样看的)为什么不从活动中谈谈你的观点? (3认同)

小智 226

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

  • 型号:渲染什么
  • 视图:如何渲染
  • 控制器:事件,用户输入

也可以这样考虑一下:在编写模型时,模型不需要担心渲染(或平台特定的代码).模型会对视图说,我不关心你的渲染是Android还是iOS或Windows Phone,这就是我需要你渲染的东西.该视图仅处理特定于平台的呈现代码.

当您使用Mono共享模型以开发跨平台应用程序时,这尤其有用.

  • 虽然这是真的,但也很好,这是理论,人们是实用的! (11认同)

Der*_*ley 47

Android上的操作,视图和活动是使用Android UI的实践方式,是model-view-viewmodel(MVVM)模式的一种实现,它在结构上与模型视图相似(在同一系列中) -controller.

据我所知,没有办法打破这个模型.它可能已经完成,但您可能会失去现有模型的所有好处,并且必须重写您自己的UI层才能使其工作.


184*_*615 29

经过一番搜索,最合理的答案如下:

MVC已经在Android中实现为:

  1. View =布局,资源和内置类,如Button派生自android.view.View.
  2. 控制器=活动
  3. Model =实现应用程序逻辑的类

(顺便说一下,这意味着活动中没有应用程序域逻辑.)

对于小型开发者来说,最合理的做法是遵循这种模式,而不是试图做谷歌决定不做的事情.

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

编辑

我们可能正在讨论MVC,但它会说FMVC,Framework - Model - View - Controller.该框架(Android操作系统)规定其组件的生命周期和相关事件的想法,并在实践中的控制器(Activity/ Service/ BroadcastReceiver)首先是负责与这些应对的框架 -imposed事件(如的onCreate() ).用户输入应该单独处理吗?即使它应该,你不能分开它,用户输入事件也来自Android.

总之,更少的代码是不特定的Android,你把你Activity/ Service/ BroadcastReceiver越好.

  • 显然,View需要了解控制器才能将事件委托给控制器.控制器将其跟踪到模型并通知View查看结果(以便它可以显示).控制器不会使视图膨胀(而Activity会这样做),也不会知道关于按钮,文本框,列表等的事情(而Activity知道). (4认同)
  • Activity可以直接访问UI,而在MVC控制器中不应该知道视图(反之亦然). (3认同)
  • @KonradMorawski嗯。。。_View_是否知道显示有关_Controller_的内容____和____?例如“按钮”的孩子知道_Controller_?_Views_仅了解显示内容似乎更合乎逻辑。考虑到_Model_仅了解数据的性质,这就是为什么需要_Controller_的原因:必须同时了解_Model_和_View_。 (2认同)

Rof*_*ion 18

没有单一的MVC模式可以遵守.MVC或多或少表明你不应该混合数据和视图,因此例如视图负责保存数据或处理数据的类直接影响视图.

但是,Android处理类和资源的方式,有时甚至被迫遵循MVC模式.在我看来,更复杂的是有时对视图负责的活动,但在同一时间充当控制者.

如果您在XML文件中定义视图和布局,请从res文件夹加载资源,如果您避免或多或少地在代码中混合这些内容,那么您无论如何都要遵循MVC模式.


Her*_*ner 14

我发现在Android上实现MVC的最佳资源是这篇文章:

我对我的一个项目采用了相同的设计,效果很好.我是Android的初学者,所以我不能说这是最好的解决方案.

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

  • 如果有一天删除文章,可以获得摘要. (8认同)

Vas*_*liy 14

您可以在Android中实现MVC,但它不是"本机支持"并且需要一些努力.

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

在此输入图像描述

我还在这里发布了更详细的答案.

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


typ*_*uck 12

我同意JDPeckham,我认为单凭XML并不足以实现应用程序的UI部分.

但是,如果您将Activity视为视图的一部分,那么实现MVC非常简单.您可以覆盖Application(由Activity中的getApplication()返回),并且您可以在此处创建一个在应用程序生命周期内存活的控制器.

(或者,您可以使用应用程序文档中建议的单例模式)


Aru*_*Das 11

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

镜像为pdf

  • 链接坏了先生 (7认同)
  • 似乎这个COSC346-lab2.2up.pdf文件不包含完整的细节. (2认同)

Dro*_*rap 11

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
Run Code Online (Sandbox Code Playgroud)

注1:

现在,这是你能做的魔术.一旦对这段代码进行了分类,就编写一个基本接口类,如IEntity和IService.声明常用方法.现在创建抽象类BaseService并声明自己的一组方法并分离代码.

注2:如果您的活动呈现多个模型,那么不是在活动中编写代码/逻辑,最好将视图分成片段.那就更好了.因此,将来如果需要在视图中显示更多模型,请再添加一个片段.

注3:代码分离非常重要.架构中的每个组件都应该是独立的,没有依赖逻辑.如果你有一些依赖逻辑的偶然机会,那么在它们之间写一个映射逻辑类.这将在未来帮助您.


Ben*_*Ben 9

Android的MVC模式是用他们的Adapter类实现的(种类).他们用"适配器"替换控制器.适配器的说明如下:

Adapter对象充当AdapterView与该视图的基础数据之间的桥梁.

我只是在研究一个从数据库中读取的Android应用程序,所以我不知道它的工作原理.然而,它似乎有点像Qt的Model-View-Delegate架构,他们声称这是传统MVC模式的一步.至少在PC上,Qt的模式运作得相当好.


Mah*_*iya 9

虽然这篇文章看起来很旧,但我想添加以下两篇来介绍这个Android领域的最新发展:

android-binding - 提供一个框架,用于启动android视图小部件与数据模型的绑定.它有助于在Android应用程序中实现MVC或MVVM模式.

roboguice - RoboGuice将猜测从发展中解脱出来.注入您的视图,资源,系统服务或任何其他对象,让RoboGuice负责细节.


Dev*_*ath 9

模型视图控制器(MVC)

在此输入图像描述


描述:

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

MVC模式基本上是这样的:

  • 型号:显示什么.这可以是数据源(例如:应用程序中的服务器,原始数据)
  • 视图:如何显示.这可以是xml.因此它充当演示过滤器.视图附加到其模型(或模型部分),并获取演示所需的数据.
  • 控制器:处理用户输入等事件.这是活动

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

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

  • 我只使用控制器作为视图/模型中继信息的管道.我很好奇你是如何将模型和视图直接接触到彼此的.您是否有此实施的来源或示例? (2认同)

小智 7

我认为最有用的简化解释如下:http: //www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

从我在这里看到并阅读的其他内容来看,实现所有这些功能使得它更难以与android的其他部分很好地兼容.

让活动实现其他侦听器已经是标准的Android方式.最无害的方法是像幻灯片一样添加Java Observer,并将onClick和其他类型的操作分组到仍在Activity中的函数中.

Android方式是Activity同时执行这两种操作.战斗它并没有真正使扩展或进行未来编码变得更容易.

我同意第二篇文章.它已经实现了,而不是人们习惯的方式.无论它是否在同一个文件中,已经存在分离.无需创建额外的分隔以使其适合其他语言和操作系统.

  • 您提供的链接已损坏. (6认同)
  • 请更新您的网址.这个不起作用. (3认同)

zse*_*rge 5

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

基本上,您有一个组件(活动,片段和视图组).在里面定义视图层的结构和样式.您还可以定义数据应如何绑定到视图.最后,您可以在同一个位置绑定侦听器.

然后,一旦您的数据发生变化 - 将调用全局"render()"方法,并使用最新数据智能地更新您的视图.

这里有一个组件的例子,里面有代码紧凑的内容(当然模型和控制器可以很容易地分开).这里"count"是一个模型,view()方法是一个视图,"v - > count ++"是一个控制器,它监听按钮点击并更新模型.

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
      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

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

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

在每个按钮上单击将增加数字,然后将调用"render()",并更新按钮文本.

如果您使用Kotlin,语法会变得更加愉快:http://zserge.com/blog/anvil-kotlin.html.此外,没有lambdas的Java有替代语法.

库本身非常轻量级,没有依赖性,不使用反射等.

(免责声明:我是这个图书馆的作者)


Ali*_*Nem 5

令人惊讶的是,这里的帖子都没有回答这个问题.它们要么太笼统,模糊,不正确,要么不解决android中的实现问题.

在MVC中,View层只知道如何显示用户界面(UI).如果需要任何数据,它将从Model层获取.但View并不直接要求模型查找数据,而是通过Controller完成.因此,Controller  调用Model来为View提供所需的数据.数据准备就绪后,Controller会通知View,数据已准备好从模型中获取.现在View可以从Model中获取数据.

此流程可归纳如下:

在此输入图像描述

值得注意的是,View可以 通过Controller(也称为被动MVC)了解  模型中数据的可用性,  或者通过向其注册可观察对象(即Active MVC)来观察模型中的数据.

在实现部分,首先想到的一件事是什么android组件应该用于ViewActivity  还是Fragment ?

答案是它没关系,两者都可以使用.该视图应该能够呈现设备上的用户界面(UI),并在用户与UI交互作出响应.双方Activity  并Fragment  为此提供必要的方法.

本文中使用的示例应用程序中,我使用Activity 了View层,但Fragment  也可以使用它.

完整的示例应用程序可以在我的GitHub库的"MVC"分支中找到这里.

我还通过这里的例子处理了android中MVC架构的优缺点.

对于那些感兴趣的人,我已经在这里开始了一系列关于Android应用程序架构的文章,其中我通过一个完整的工作应用程序比较不同的架构,即MVC,MVP,MVVM,用于Android应用程序开发.