首页 文章

Android上的MVC模式

提问于
浏览
471

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

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

21 回答

  • 232

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

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

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

  • 5

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

    mirror for the pdf

  • 11

    Android上的操作,视图和活动是与Android UI一起使用的烘焙方式,是 model–view–viewmodel (MVVM) pattern 的实现,它在结构上与模型 - 视图 - 控制器相似(在同一系列中) .

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

  • 14

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

    从我在这里看到并阅读的其他内容来看,实现所有这些事情会使其变得更难,并且与android的其他部分不相容 .

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

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

    我同意the 2nd post . 它's sort of already implemented, just not the way people are used to. Whether or not it'是在同一个文件中还是没有,已经分离了 . 无需创建额外的分隔以使其适合其他语言和操作系统 .

  • 7

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

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

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

  • 9

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

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

    enter image description here

    我还发布了更详细的答案here .

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

  • 9

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

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

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

  • 10

    Android中的模型 - 视图 - 控制器在2011年左右,当Android开始变得越来越流行时,架构问题自然而然地出现了 . 由于MVC是当时最流行的UI模式之一,开发人员也尝试将其应用于Android .

    Model 模型表示一组描述业务逻辑的类,即业务模型以及数据访问操作,即数据模型 . 它还定义了数据的业务规则,这意味着如何更改和操作数据 .

    View View表示UI组件 . 它仅负责显示从控制器接收的数据 . 这也将模型转换为UI .

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

    换句话说

    模特:内容提供商 . 数据管理器是推荐的应用程序间数据共享形式 .

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

    控制器:服务 . 这些是背景组件,其行为类似于UNIX守护程序和Windows服务 . 它们无形地运行并执行持续的无人值守处理 .

  • 3

    厌倦了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
          });
        });
      }
    

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

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

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

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

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

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

  • 4

    没有实现的MVC体系结构,但是存在一组库/示例来实现MVP(模型 - 视图 - 呈现器)体系结构 .

    请检查以下链接:

    谷歌添加了一个Android架构MVP的例子:

  • 217

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

    • 您可以通过分辨率,硬件等在各种XML文件中定义user interface .

    • 您可以通过区域设置等在各种XML文件中定义resources .

    • 您扩展了类似ListActivityTabActivity的分支,并通过inflaters使用XML文件 .

    • 您可以根据业务逻辑创建任意数量的类 .

    • 已经为你编写了很多Utils - DatabaseUtils,Html .

  • 47

    MVC- Architecture on Android 最好在Android中关注任何MVP而不是MVC . 但仍然根据问题的答案,这可以解决

    Description and Guidelines

    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
    

    NOTE 1:

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

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

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

  • 17

    模型视图控制器(MVC)

    enter image description here


    Description:

    • 当我们必须在软件开发中主要大型项目时,通常使用MVC,因为它是组织项目的通用方式 .

    • 新开发人员可以快速适应项目

    • 也有助于大项目和跨平台的开发 .


    The MVC pattern is essentially this:

    • 型号:显示什么 . 这可以是数据源(例如:应用程序中的服务器,原始数据)

    • 查看:如何显示 . 这可以是xml . 因此它充当演示过滤器 . 视图附加到其模型(或模型部分),并获取演示所需的数据 .

    • 控制器:处理用户输入等事件 . 这是活动


    Important feature of MVC: 我们可以修改模型或视图或控制器仍然不影响其他模型

    • 假设我们更改了视图中的颜色,视图大小或视图位置 . 通过这样做,它不会影响模型或控制器

    • 假设我们更改模型(而不是从服务器获取的数据从资产中获取数据)仍然不会影响视图和控制器

    • 假设我们更改了Controller(活动中的逻辑),它不会影响模型和视图

  • 14

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

    因为我不会谷歌强制施加像iPhone这样的MVC实现的限制,但是它可以在他们的项目中使用他们想要的模板或技术,在小型或简单的应用程序中不需要使用MVC,而是作为应用程序变得越来越复杂在以后的几年中需要对其代码进行修改,然后需要Android中的MVC模式 .

    它提供了一种简单的方法来修改代码,还有助于减少问题 . 如果您想在Android上实现MVC,请在下面给出链接,并在您的项目中享受MVC实现 .

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

    但是现在我认为MVP和Android Architectural Pattern是开发人员应该用于干净和强大的Android应用程序的最佳选择之一 .

  • 4

    Android的MVC模式是用他们的Adapter类实现的 . 它们用"adapter."替换控制器适配器状态的描述:

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

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

  • 3

    根据the explanation,Xamarin团队解释(在iOS MVC "I know it seems weird, but wait a second"上):

    • 模型(数据或应用程序逻辑),

    • 视图(用户界面)和

    • 控制器(代码隐藏) .

    我可以这样说:

    Android上的模型只是可以分配的对象 . 视图是XML布局,控制器是(活动其片段) .

    *这只是我的观点,不是来自任何资源或书籍 .

  • 2

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

    MVC已经在Android中实现为:

    • View =布局,资源和内置类,如 Button ,派生自 android.view.View .

    • Controller =活动

    • Model =实现应用程序逻辑的类

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

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

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

    编辑

    我们可能正在谈论MVC,但它会说FMVC,Framework - Model - View - Controller . 框架(Android OS)强加了组件生命周期和相关事件的概念,在实践中,Controller( Activity / Service / BroadcastReceiver )首先负责处理这些框架强加的事件(例如onCreate()) . 用户输入应该单独处理吗?即使它应该,你不能分开它,用户输入事件也来自Android .

    无论如何,你输入 Activity / Service / BroadcastReceiver 的特定Android代码越少越好 .

  • 1

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

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

    该流程可总结如下:

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

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

    答案是它没关系,两者都可以使用 . View应该能够在设备上呈现用户界面(UI)并响应用户与UI的交互 . ActivityFragment 都为此提供了所需的方法 .

    this article中使用的示例应用程序中,我使用 Activity 作为View图层,但也可以使用 Fragment .

    完整的示例应用程序可以在我的GitHub repo here的'mvc'分支中找到 .

    我还通过一个例子here处理了android中MVC架构的优缺点 .

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

  • 24

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

    • Model: 要渲染的内容

    • View: 如何渲染

    • Controller: 事件,用户输入

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

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

  • 12

    当我们将MVC,MVVMPresentation Model应用于Android应用程序时,我们真正想要的是拥有一个清晰的结构化项目,更重要的是更容易进行单元测试 .

    目前,没有第三方框架,您通常会有很多代码(如addXXListener(),findViewById()等),这些代码不会添加任何业务 Value .

    更重要的是,你必须运行Android单元测试而不是正常的JUnit测试,这需要花费很长时间才能运行并使单元测试变得有些不切实际 . 出于这些原因,几年前我们开始了一个开源项目,RoboBinding - Android平台的数据绑定演示模型框架 .

    RoboBinding可帮助您编写易于阅读,测试和维护的UI代码 . RoboBinding不需要 unnecessary code like addXXListener or so ,并将UI逻辑转换为Presentation Model,这是一个POJO,可以通过 normal JUnit tests 进行测试 . RoboBinding本身带有300多个JUnit测试,以确保其质量 .

  • 9

    我发现在Android上实现MVC的最佳资源是this post

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

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

相关问题