Android MVVM 设计模式示例

Posted

技术标签:

【中文标题】Android MVVM 设计模式示例【英文标题】:Android MVVM Design Pattern Examples 【发布时间】:2011-06-25 18:25:36 【问题描述】:

我目前做了很多 WPF 开发,并开始创建一些基本的 android 应用程序。在创建 WPF 应用时,我经常使用 MVVM,通常使用 Prism,想知道是否有适用于 Android 平台的 MVVM 示例?

【问题讨论】:

从几个月前开始,Google 发布了官方Data Binding Library。 Here你可以找到一篇关于它如何与 MVVM 模式一起使用的文章。 这里有一个用于 MVVM 和 RxJava 在 android 中的示例:***.com/a/50421750/4514796 【参考方案1】:

我是Android-Binding 的开发者。就像@Brentley 所说,这是一个非常新的项目,但我确实希望获得更多的关注和经验,以便改进它。回到你的问题,我写了一些关于 MVVM with android-binding 的简单介绍/教程:

Android MVVM Tutorials (with android binding) Introduction to Android Binding (codeproject) Model Validation in Android Binding (codeproject) Wiki in project homepage

潜在的采用者也请在project discussion group.注册

【讨论】:

完美,这正是我想要的。使用 android-binding 是否会对性能产生影响? 到目前为止,我认为它们并不引人注目。您可以前往 Market 并搜索我编写的那些示例(搜索:android binding,在 Android Market 中)并亲自查看。 @xandy 很晚了。但是安迪,你在那里做了一些很棒的工作。将使用 android 绑定并等待 v 1.x.x 发布。无论如何,关于何时可以使用完整的库?【参考方案2】:

我有时会使用 ViewModels 将纯模型转换为模型应显示的内容,但很多 MVVM 主义都来自这样一个事实,即您在 WPF 框架中内置了这个庞大的数据绑定引擎。您可能在 Android 世界中找不到 WPF + MVVM 的确切体验,但您可以采用很多好的概念并实现它们(只是没有自动数据绑定的东西)。

首先,只需创建 ViewModel。您不需要像 Prism 这样的框架来创建 ViewModel。您没有所有的 PropertyChanged 通知和类似的东西,但是您可以将您的数据转换为您的 UI 可以更好地使用的信息,这将清理您的代码。一个完美的例子是我用一个重滑块的 UI 做的事情。 Android 的 SeekBar 始终从零开始并使用整数值,因此您不能绑定到模型中的最小值、最大值和增量值。您可以使用 ViewModel 将您的最小/最大值转换为您的 SeekBar 可以使用的基于 0 的等价物……只是一个示例。根据值范围等显示颜色和大小也是如此。对我来说,这就是 ViewModel 的全部意义所在。

就 DependencyInjection 而言,请查看 RoboGuice。在本地 Meetup 上看到其创建者的演示文稿后,我刚开始在我的一个项目中使用它,它可能正是您想要的。

RoboGuice on Google Code

RoboGuice Google Group

【讨论】:

谢谢。从阅读few other posts 看来,Android 几乎是为 MVC 模式设置的。 RoboGuice 看起来非常有用,我喜欢它解析 UI 组件的方式,而不必进行大量 findViewById 调用。【参考方案3】:

太棒了! @Florina Muntenescu的文章

模型-视图-视图模型模式

MVVM 模式的主要参与者有:

View — 通知 ViewModel 用户的操作 ViewModel — 公开与视图相关的数据流 DataModel — 抽象数据源。 ViewModel 与 DataModel 来获取和保存数据。

MVVM 架构示例:

https://github.com/erikcaffrey/People-MVVM

https://github.com/googlesamples/android-architecture/tree/todo-mvvm-databinding/

https://github.com/iammert/Android-MVVM-Architecture

https://github.com/segunfamisa/android-mvvm-sample

https://github.com/manas-chaudhari/android-mvvm

【讨论】:

【参考方案4】:

现在有一个官方的 Android 数据绑定插件,虽然它目前仍处于测试阶段。还在进行工作以在 Android Studio 测试版中添加对绑定语法的工具支持。

更多信息见下文:

https://developer.android.com/tools/data-binding/guide.html

【讨论】:

【参考方案5】:

正在开发一个相对较新的框架,它允许将视图绑定到名为android-binding 的视图模型。使用此框架和RoboGuice,您可以启动 MVVM。该框架仍需要一些工作,但这是一个很好的起点。

【讨论】:

【参考方案6】:

Android-Data-Binding 库是将数据连接到用户界面元素的工具。创建布局文件并标记每个项目后,一行代码将所有数据绑定到用户界面元素,并为其他任务节省时间。

【讨论】:

【参考方案7】:

最近我实现了 MVVM 模式,用于使用数据绑定库构建 Android 应用程序。在这里你可以阅读我所做工作的详细回顾和代码片段:http://cases.azoft.com/mvvm-android-data-binding/

要了解有关该主题的更多信息,您还可以查看这些应用示例:https://github.com/ivacf/archi

有使用搜索和列表屏幕完成工作的视觉示例。

【讨论】:

【参考方案8】:

几年前我也做过一些WPF&WP开发,Prism & MVVM Light Toolkit是常用的WP App搭建,我觉得非常适合windows phone应用架构!所以我利用我之前的WP开发经验然后模仿创建Android MVVM Light Toolkit(一个帮助构建Android MVVM应用程序的工具包,我们有更多的属性用于View的数据绑定(如Uri for ImageView),我们创建了一些处理事件的命令(比如按钮的点击),还有一个全局消息管道来与其他 ViewModel 通信。

GitHub:Android MVVM Light Toolkit,有样例供参考。

架构: http://upload-images.jianshu.io/upload_images/966283-78b410b9af8b18fa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

希望能帮到你!

【讨论】:

图片链接给了我我认为是中文的错误信息,然后是:wssupport@chinanetcenter.com Via:tzhdx29:10 (Cdn Cache Server V2.0)【参考方案9】:

有一个名为MVVMCross的项目。

它是免费、开源且精心设计的 MVVM 框架,由 Stuart Lodge 开发。

他为 Android 和 iPhone 实现了绑定,所以现在 MVVM 也适用于所有这些平台。

对我来说,它是最好的 MVVM 框架之一——它真正展示了 MVVM 的力量。有了它,您可以为不同的平台(WP7、Android、iPhone、WinRT)编写一个代码(模型和视图模型层),并且只需更改应用程序 UI(视图层)。

【讨论】:

这是针对没有 Android Java 原生的 MonoDroid 最终结果是一个安卓应用。他从来没有在他的问题中直接提到 java。【参考方案10】:

仅供参考,以供可能感兴趣的其他人参考。我是RoboBinding 的贡献者 - Android 平台的数据绑定表示模型框架。它是用于相同目的的另一个框架。除了帮助项目结构之外,RoboBinding 的一个主要重点是使使用普通 JUnit 测试而不是 Android 单元测试来测试 Android 应用程序成为可能,因为单元测试对于保证项目质量非常重要,但是 Android 单元测试需要很长时间才能运行并使单元测试有些不切实际。 RoboBinding 本身带有 300 多个 JUnit 测试以确保其质量。 MVVM 起源于 Microsoft,是 Martin Fowler 引入的 Presentation Model 设计模式的专门化。其他替代方案:Android-Binding、Bindroid 和 MvvmCross。

【讨论】:

【参考方案11】:

您可以按照以下步骤进行片段中的数据绑定:我已经在片段中绑定数据的示例中发布了设计和 java 类。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
    <data class=".UserBinding">
        <variable  name="user" type="com.darxstudios.databind.example.User"/>
    </data>
 <RelativeLayout

    xmlns:tools="http://schemas.android.com/tools" android:layout_
    android:layout_ android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivityFragment"
    >



        <TextView android:text='@user.firstName+"  "+user.lastName' android:layout_
        android:layout_
            android:id="@+id/textView" />

     <Button
         android:layout_
         android:layout_
         android:text="New Button"
         android:id="@+id/button"
         android:layout_below="@+id/textView"
         android:layout_toEndOf="@+id/textView"
         android:layout_marginStart="40dp"
         android:layout_marginTop="160dp" />

 </RelativeLayout>
</layout>


    public class MainActivityFragment extends Fragment 

    public MainActivityFragment() 
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 

        final User user = new User();
        user.setFirstName("Michael");
        user.setLastName("Cameron");
        UserBinding binding = DataBindingUtil.inflate(inflater,R.layout.fragment_main, container, false);
        binding.setUser(user);

        View view = binding.getRoot();

        final Button button = (Button) view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() 
            public void onClick(View v) 
                user.setFirstName("@Darx");
                user.setLastName("Val");
            
        );

        return view;
    


Developer site DataBinding Guide Line

【讨论】:

【参考方案12】:

我发现这个Writing Testable Android MVVM 应用程序系列写的关于使用 Android 数据绑定库的 MVVM 非常好。在系列中他从简单的示例到recyclerview 进行了解释,并且还有测试。

你也可以试试mv2m library。

【讨论】:

【参考方案13】:

在 github 上有很多 MVVM 框架的例子。我推荐使用DroidWizard

DroidWizard 在视图和视图模型之间做自己的耦合,框架与 mvvm 略有不同。

ModelEngine ViewModel View instean of Model ViewModel View

【讨论】:

【参考方案14】:

https://github.com/MindorksOpenSource/android-mvvm-architecture

Android MVVM 架构:示例应用

此存储库包含一个详细的示例应用程序,该应用程序使用 Dagger2、Room、RxJava、FastAndroidNetworking、PlaceHolderView 和 AndroidDebugDatabase 实现 MVVM 架构

该应用有以下软件包:

data: It contains all the data accessing and manipulating components.
di: Dependency providing classes using Dagger2.
ui: View classes along with their corresponding ViewModel.
utils: Utility classes.

【讨论】:

以上是关于Android MVVM 设计模式示例的主要内容,如果未能解决你的问题,请参考以下文章

java 带有mvvm模式的Android活动类示例。

xml 带有数据绑定的mvvm模式的Android xml视图示例。

Android MVVM 设计模式

Android DataBinding库(MVVM设计模式)

WPF经典编程模式-MVVM示例讲解

在 android 中使用 MVVM 设计模式时出错找不到符号类 ViewModel