有可能在Java中为Android实现模型-视图-控制器模式吗?
或者它已经通过活动实现了吗?或者有没有更好的方法来实现Android的MVC模式?
有可能在Java中为Android实现模型-视图-控制器模式吗?
或者它已经通过活动实现了吗?或者有没有更好的方法来实现Android的MVC模式?
当前回答
没有实现的MVC体系结构,但是存在一组库/示例来实现MVP(模型-视图-呈现器)体系结构。
请查看这些链接:
https://github.com/sockeqwe/mosby https://github.com/android10/Android-CleanArchitecture https://github.com/antoniolg/androidmvp
谷歌增加了一个Android架构MVP的例子:
https://github.com/googlesamples/android-architecture
其他回答
当我们将MVC、MVVM或Presentation Model应用到Android应用中时,我们真正想要的是有一个清晰的结构化项目,更重要的是更容易进行单元测试。
目前,如果没有第三方框架,通常会有大量代码(如addXXListener()、findViewById()等),这不会增加任何业务价值。
更重要的是,你必须运行Android单元测试,而不是正常的JUnit测试,后者需要很长时间才能运行,并且使单元测试有些不切实际。基于这些原因,几年前我们开始了一个开源项目RoboBinding——一个用于Android平台的数据绑定表示模型框架。
RoboBinding帮助您编写更易于阅读、测试和维护的UI代码。RoboBinding消除了对addXXListener等不必要代码的需求,并将UI逻辑转移到表示模型(Presentation Model),这是一个POJO,可以通过正常的JUnit测试进行测试。RoboBinding本身带有300多个JUnit测试,以确保其质量。
没有普遍唯一的MVC模式。MVC是一个概念,而不是一个可靠的编程框架。你可以在任何平台上实现你自己的MVC。只要你坚持以下基本思想,你就是在实现MVC:
模型:渲染什么 视图:如何渲染 控制器:事件,用户输入
也可以这样考虑:当您为模型编程时,模型不应该担心呈现(或特定于平台的代码)。模型会对视图说,我不在乎你的渲染是Android, iOS还是Windows Phone,这是我需要你渲染的。 视图将只处理特定于平台的呈现代码。
当您使用Mono共享模型以开发跨平台应用程序时,这一点特别有用。
我发现在Android上实现MVC最好的资源是这篇文章:
我在自己的一个项目中采用了同样的设计,效果非常好。我是Android的初学者,所以我不能说这是最好的解决方案。
我做了一个修改:我实例化了应用程序类中每个活动的模型和控制器,这样当横向-纵向模式更改时就不会重新创建这些模型和控制器。
厌倦了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,语法将变得更加舒适。此外,对于没有lambdas的Java还有其他语法。
这个库本身是非常轻量级的,没有依赖关系,不使用反射等等。
(声明:我是这个库的作者)
虽然这篇文章看起来很旧,但我想添加以下两篇文章来介绍Android在这一领域的最新发展:
android-binding -提供一个框架,使android视图小部件绑定到数据模型。它有助于在android应用程序中实现MVC或MVVM模式。
roboguice——roboguice去掉了开发过程中的猜测。注入您的视图,资源,系统服务,或任何其他对象,并让RoboGuice照顾的细节。