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

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

【问题讨论】:

标签: java android design-patterns mvvm dependency-injection


【解决方案1】:

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

潜在的采用者也请在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_width="match_parent"
                  android:layout_height="match_parent" 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_width="wrap_content"
                      android:layout_height="wrap_content"
                          android:id="@+id/textView" />
              
                   <Button
                       android:layout_width="wrap_content"
                       android:layout_height="wrap_content"
                       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.
                    

                    【讨论】:

                      猜你喜欢
                      • 2014-08-31
                      • 1970-01-01
                      • 2017-11-17
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-11-21
                      相关资源
                      最近更新 更多