java -Android上的MVC模式

查看原始版本

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

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

所有回答
  • Nora Lee #1

    在Android中,你没有MVC,但是你有以下功能:

    • 您可以通过分辨率、硬件等在各种XML文件中定义user interface
    • 您可以按区域设置等在各种XML文件中定义resources
    • 您可以扩展像ListActivityTabActivity这样的类,并通过inflaters使用XML文件
    • 您可以为业务逻辑创建任意多个类
    • 已经为您编写了很多Utils-数据库实用程序,Html
  • Veromca Lee #2

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

    • Model:要呈现的内容
    • View:如何渲染
    • Controller:事件,用户输入

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

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

  • Susan Lee #3

    Android上的操作、视图和活动是与Android UI协同工作的基础,是[rpstrong 1]的一个实现,它在结构上与model-view-controller(在同一个家族中)相似

    据我所知,没有办法打破这种模式。这可能是可行的,但是你可能会失去现有模型所拥有的所有好处,不得不重写你自己的UI层以使它工作。

  • Alexia Lee #4

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

    MVC已经在Android中实现为:

    1. View=layout,resources和内置类,比如从android.view.View派生的Button
    2. 控制器=活动
    3. 模型=实现应用程序逻辑的类

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

    对于一个小型开发人员来说,最合理的做法是遵循这种模式,而不是尝试做谷歌决定不做的事情

    PS注意,活动有时会重新启动,因此没有模型数据的位置(导致重新启动的最简单方法是从XML中省略android:configChanges="keyboardHidden|orientation"并转动设备)

    编辑

    我们可能在谈论MVC,但我们会这样说,FMVC,Framework,Model,View,Controller。框架(Android操作系统)强加了其组件生命周期和相关事件的概念,在实践中,控制器Activity/Service/BroadcastReceiver)首先负责处理这些框架强加的事件(例如onCreate())。是否应单独处理用户输入?即使应该这样做,也不能将其分离,用户输入事件也来自Android

    不管怎样,你在Activity/Service/BroadcastReceiver中输入的代码越少越好

  • Bess Lee #5

    没有单一的MVC模式可以遵循。MVC只是或多或少地声明您不应该将数据和视图混合在一起,以便视图负责保存数据或处理直接影响视图的数据的类

    但是,尽管如此,Android处理类和资源的方式,有时甚至不得不遵循MVC模式。在我看来,更为复杂的是那些有时对视图负责,但同时又充当控制器的活动

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

  • Bruce Lee #6

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

    也就是说,我个人倾向于将MVP作为Android开发的更干净的架构模式。我说MVP是指:

    enter image description here

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

    在研究了Android中MVC/MVP实现的各种方法之后,我提出了一个合理的架构模式,我在本文中描述了这个模式:MVP and MVC Architectural Patterns in Android

  • Ophelia Lee #7

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

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

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

  • Isabel Lee #8

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

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

    (或者,您可以按照应用程序文档的建议使用singleton模式)

  • Cash Lee #9

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

    mirror for the pdf

  • Abner Lee #10

    MVC- Architecture on Android 在android中,最好使用MVP而不是MVC。但根据对问题的回答,这仍然是一个解决方案

    Enter image description here

    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:分离代码非常重要。架构中的每个组件都应该是独立的,而不是具有依赖逻辑。如果碰巧你有依赖逻辑,那么在两者之间写一个映射逻辑类。这对你将来有帮助

  • Odelia Lee #11

    Android的MVC模式是用它们的Adapter类实现的。它们用“适配器”替换控制器。适配器的说明如下:

    An Adapter object acts as a bridge between an AdapterView and the underlying data for that view.

    我只是在为一个从数据库中读取数据的Android应用程序研究这个,所以我还不知道它有多好。然而,这似乎有点像Qt的模型-视图-委托体系结构,他们声称这是传统MVC模式的一个进步。至少在PC机上,Qt的模式工作得相当好

  • Augustine Lee #12

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

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

    roboguice-RoboGuice消除了开发过程中的猜测。注入视图、资源、系统服务或任何其他对象,并让RoboGuice处理细节

  • Caesar Lee #13

    Model View Controller (MVC)

    enter image description here


    Description:

    • 当我们不得不在软件开发中进行大型项目时,MVC 通常使用,因为它是组织 项目
    • 新的开发人员可以很快适应这个项目
    • 有助于大型项目和跨平台的开发

    The MVC pattern is essentially this:

    • 模型:显示什么。这可以是数据源(例如:服务器、原始 应用程序中的数据)
    • 视图:显示方式。这可以是xml。因此,它的作用是 演示文稿筛选器。视图附着到其模型(或模型零件) 获取演示所需的数据
    • 控制器:处理用户输入等事件。这就是活动

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

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

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

    从我在这里看到和读到的所有东西来看,实现所有这些东西会使它变得更加困难,并且不适合android的其他部分

    让活动实现其他侦听器已经是标准的Android方式。最无害的方法是添加Java观察者(如幻灯片所示),将onClick和其他类型的操作描述并分组到仍在活动中的函数中

    Android的方式是活动两者兼而有之。与之抗争并不能真正使扩展或将来的编码变得更容易

    我同意the 2nd post。它已经实现了,只是不像人们习惯的那样。不管它是否在同一个文件中,都已经存在分离。不需要创建额外的分隔来适应其他语言和操作系统

  • Augustine Lee #15

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

    基本上,您有一个组件(activity、fragment和viewgroup)。在内部定义视图图层的结构和样式。还可以定义数据应如何绑定到视图。最后,您可以在同一个地方绑定侦听器

    然后,一旦您的数据被更改,将调用全局“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,语法会变得更加愉快。另外,对于没有lambdas的Java,还有其他的语法

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

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

  • Susie Lee #16

    令人惊讶的是,这里的帖子都没有回答这个问题。它们要么过于笼统、含糊、不正确,要么不涉及android的实现

    在MVC中,视图层只知道如何显示用户界面(UI)。如果这需要任何数据,它将从模型层获取。但是视图并不直接要求模型查找数据,而是通过控制器来查找数据。因此控制器调用模型视图提供所需的数据。一旦数据就绪,控制器通知视图数据已准备好从模型获取。现在视图可以从模型中获取数据

    该流程总结如下:

    enter image description here

    值得注意的是,视图可以通过控制器(也称为[rpstrong 1])了解模型中数据的可用性,也可以通过注册可观察到的数据(即[rpstrong 2])来观察模型中的数据

    在实现部分,首先想到的一件事是,应该为视图使用哪个android组件?ActivityFragment

    答案是,这无关紧要,两者都可以使用。视图应该能够在设备上显示用户界面(UI),并响应用户与UI的交互。ActivityFragment都为此提供了所需的方法

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

    完整的示例应用程序可以在GitHub repohere的“mvc”分支中找到

    我还通过一个例子here讨论了android中MVC架构的优缺点

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

  • Kirk Lee #17

    根据Xamarin团队解释的the explanation(在iOS MVC上,“我知道这看起来很奇怪,但请稍等”):

    • 模型(数据或应用逻辑)
    • 视图(用户界面),以及
    • 控制器(代码隐藏)

    我可以这么说:

    Android上的模型只是一个可打包的对象。视图是XML布局,控制器是(活动+其片段)

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

  • Zona Lee #18

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

    请检查以下链接:

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

  • Rita Lee #19

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

    因为我不认为Google会像iPhone那样强制限制MVC的实现,但这取决于开发人员在他们的项目中想要的模式或技术,在小型或简单的应用程序中不需要使用MVC,但是随着应用程序的增长和变得复杂,需要在以后修改代码几年后,Android就需要MVC模式了

    它提供了修改代码的简单方法,也有助于减少问题。 如果你想在Android上实现MVC,那么按照下面的链接,在你的项目中享受MVC的实现

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

    但现在,我认为MVP和Android架构模式是开发人员应该用于干净和健壮的Android应用程序的最佳选择之一

  • Gavin Lee #20

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

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

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

    RoboBinding帮助您编写更易于阅读、测试和维护的UI代码。RoboBinding消除了unnecessary code like addXXListener or so的需要,并将UI逻辑转移到表示模型,表示模型是一个POJO,可以通过normal JUnit tests进行测试。RoboBinding本身有300多个JUnit测试来确保其质量

  • April Lee #21

    据我所知,Android处理MVC模式的方式如下:

    您有一个活动,它充当控制器。你有一个负责获取数据的类——模型,然后你有一个视图类——视图

    当谈到视图时,大多数人只考虑它在xml中定义的可视部分。我们不要忘记,视图还有一个程序部分,它的构造函数、方法等都是在java类中定义的