Moh*_*nde 493 java model-view-controller android design-patterns
是否可以在Java for Android中实现模型 - 视图 - 控制器模式?
或者它是否已通过活动实施?或者有更好的方法来实现Android的MVC模式?
Pen*_*m10 239
在Android中你没有MVC,但你有以下内容:
Der*_*ley 47
Android上的操作,视图和活动是使用Android UI的实践方式,是model-view-viewmodel(MVVM)模式的一种实现,它在结构上与模型视图相似(在同一系列中) -controller.
据我所知,没有办法打破这个模型.它可能已经完成,但您可能会失去现有模型的所有好处,并且必须重写您自己的UI层才能使其工作.
184*_*615 29
经过一番搜索,最合理的答案如下:
MVC已经在Android中实现为:
Button派生自android.view.View.(顺便说一下,这意味着活动中没有应用程序域逻辑.)
对于小型开发者来说,最合理的做法是遵循这种模式,而不是试图做谷歌决定不做的事情.
PS请注意,Activity有时会重新启动,因此它不适用于模型数据(导致重新启动的最简单方法是省略android:configChanges="keyboardHidden|orientation"XML并转动设备).
编辑
我们可能正在讨论MVC,但它会说FMVC,Framework - Model - View - Controller.该框架(Android操作系统)规定其组件的生命周期和相关事件的想法,并在实践中的控制器(Activity/ Service/ BroadcastReceiver)首先是负责与这些应对的框架 -imposed事件(如的onCreate() ).用户输入应该单独处理吗?即使它应该,你不能分开它,用户输入事件也来自Android.
总之,更少的代码是不特定的Android,你把你Activity/ Service/ BroadcastReceiver越好.
Rof*_*ion 18
没有单一的MVC模式可以遵守.MVC或多或少表明你不应该混合数据和视图,因此例如视图负责保存数据或处理数据的类直接影响视图.
但是,Android处理类和资源的方式,有时甚至被迫遵循MVC模式.在我看来,更复杂的是有时对视图负责的活动,但在同一时间充当控制者.
如果您在XML文件中定义视图和布局,请从res文件夹加载资源,如果您避免或多或少地在代码中混合这些内容,那么您无论如何都要遵循MVC模式.
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
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:代码分离非常重要.架构中的每个组件都应该是独立的,没有依赖逻辑.如果你有一些依赖逻辑的偶然机会,那么在它们之间写一个映射逻辑类.这将在未来帮助您.
虽然这篇文章看起来很旧,但我想添加以下两篇来介绍这个Android领域的最新发展:
android-binding - 提供一个框架,用于启动android视图小部件与数据模型的绑定.它有助于在Android应用程序中实现MVC或MVVM模式.
roboguice - RoboGuice将猜测从发展中解脱出来.注入您的视图,资源,系统服务或任何其他对象,让RoboGuice负责细节.

描述:
MVC模式基本上是这样的:
MVC的重要特性: 我们可以修改模型或视图或控制器仍然不影响其他模型
小智 7
我认为最有用的简化解释如下:http: //www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
从我在这里看到并阅读的其他内容来看,实现所有这些功能使得它更难以与android的其他部分很好地兼容.
让活动实现其他侦听器已经是标准的Android方式.最无害的方法是像幻灯片一样添加Java Observer,并将onClick和其他类型的操作分组到仍在Activity中的函数中.
Android方式是Activity同时执行这两种操作.战斗它并没有真正使扩展或进行未来编码变得更容易.
我同意第二篇文章.它已经实现了,而不是人们习惯的方式.无论它是否在同一个文件中,已经存在分离.无需创建额外的分隔以使其适合其他语言和操作系统.
厌倦了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有替代语法.
库本身非常轻量级,没有依赖性,不使用反射等.
(免责声明:我是这个图书馆的作者)
令人惊讶的是,这里的帖子都没有回答这个问题.它们要么太笼统,模糊,不正确,要么不解决android中的实现问题.
在MVC中,View层只知道如何显示用户界面(UI).如果需要任何数据,它将从Model层获取.但View并不直接要求模型查找数据,而是通过Controller完成.因此,Controller 调用Model来为View提供所需的数据.数据准备就绪后,Controller会通知View,数据已准备好从模型中获取.现在View可以从Model中获取数据.
此流程可归纳如下:
值得注意的是,View可以 通过Controller(也称为被动MVC)了解 模型中数据的可用性, 或者通过向其注册可观察对象(即Active MVC)来观察模型中的数据.
在实现部分,首先想到的一件事是什么android组件应该用于View?Activity 还是Fragment ?
答案是它没关系,两者都可以使用.该视图应该能够呈现设备上的用户界面(UI),并在用户与UI交互作出响应.双方Activity 并Fragment 为此提供必要的方法.
在本文中使用的示例应用程序中,我使用Activity 了View层,但Fragment 也可以使用它.
完整的示例应用程序可以在我的GitHub库的"MVC"分支中找到这里.
我还通过这里的例子处理了android中MVC架构的优缺点.
对于那些感兴趣的人,我已经在这里开始了一系列关于Android应用程序架构的文章,其中我通过一个完整的工作应用程序比较不同的架构,即MVC,MVP,MVVM,用于Android应用程序开发.
| 归档时间: |
|
| 查看次数: |
235965 次 |
| 最近记录: |