Android的数据绑定(类似于WPF)?

在发布之前,我已经search了一些类似的问题 – 但是,当涉及到Android和数据绑定时,我有一个普遍的问题(我检查的其他答案并没有让我更进一步…)。 假设你有一个class车:

public class Vehicle { private Owner owner; private String brand; //getter and setter for above attributes... } 

这里是业主类….

 public class Owner { private String name; } 

现在 – 我最近正在研究微软WPF所使用的MVVM(ModelView-ViewModel)模式。 这让我想知道:假设我想绑定车辆对象的子对象的所有者对象的名称属性 – 在Android中会有一些标准的方式来实现这一点? 还假设,我可能需要validationinput之前,我可以更新模型?

我想象下面的组件(假设MVVM):

  • 视图(一个活动)不包含应用程序逻辑 – 所以它或多或less是空的
  • ViewModel将处理Vehicle对象的实例并对其执行操作
  • 模型本身将看起来像我之前发布的代码 – 完全无视视图和ViewModel

现在,当我添加我的EditTexts,TextViews等视图,我希望他们绑定到我的上下文对象(在这种情况下,车辆)的某些属性…如果我的问题不清楚,或者你需要进一步的信息让我知道:)提前感谢。

Ps我认为熟悉WPF的人现在可能是什么意思? 我自己刚刚读了WPF,发现这是一个很好的方式来处理的东西。

PPs我知道的Android绑定项目,但我想知道是否有一种内置的方式在Android中,也许一些约定有人跟着:)这真的是更多的绑定理论问题,我猜…

Solutions Collecting From Web of "Android的数据绑定(类似于WPF)?"

没有任何东西“烘焙”到Android SDK中,它提供了在MS WPF中发现的等同的数据绑定function。 Google为运行Android的各种设备提供较低级别的界面。 迄今为止,Android开发社区还没有出现更高层次的应用程序框架。 (恕我直言,考虑到所有各种Android设备的框架的所有不同限制,需要像Google这样的怪物公司来创build这样的事情。)

您可以在自己的应用程序中创build一组数据绑定类来处理您对MVVM模式的需求。 “数据绑定”将在Android View对象上设置相关的事件处理程序,并在您的ViewModel对象上运行一些适当的方法作为响应。 他们还会将ViewModel上的更改事件(您定义的)转换为View对象的相应属性分配。

对于你的申请来说,这是否值得呢?这是一个判断。 我的猜测是,需要更多的努力来编写Databinder类,而不是直接挂钩较低级别的View事件处理程序。 当你不必自己编写框架时,框架是有用的。

本地数据绑定

Google已经推出了原生的数据绑定库!

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

这可以让你写下你的观点

 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}"/> 

但是此时它的事件连接机制(rc1版本)无法绑定到从Observable扩展的类上的方法(编译时抛出exception;这是一个已知的错误 ,将被解决)。

而且肯定缺less双向绑定(预计不会在第一个版本上 )是一个很大的缺点。

无论如何,这是一个很好的示例项目,可以使用https://github.com/saleeh93/data-binding-samples

那么,我的Android绑定项目正试图通过XML布局来进行数据绑定。 因为没有Google提供的内置方法(我不能预见Google会这样做),所以我开始这个项目的原因是。

Android M将提供强大的数据库绑定function!

它现在在开发预览版本中可用。

它在xmljava文件里看起来很神奇:

 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" /> 

Java bean:

 public class User { private final String firstName; private final String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return this.firstName; } public String getLastName() { return this.lastName; } } 

捆绑:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); User user = new User("Test", "User"); binding.setUser(user); } 

关于这个主题,我刚刚发现了RoboBinding ,一个Android的“数据绑定表示模型框架”。

与Android绑定项目类似,您可以使用额外的名称空间将属性(单向或双向)和事件绑定到XML视图。

虽然它也没有内置的方法,但它可能对你很有帮助。

既然你第一次问你的问题,景观已经改变了很多。
最重要的是Stuart Lodge给了我们MVVMCross

该项目提供了一个基于Silverlight for WP7,Mono for Android和MonoTouch for iOS的跨平台mvvm移动开发框架,以及用于Windows 8 Store应用程序的WinRT XAML框架。该项目大量使用可移植类库来提供可维护的交叉平台C#原生应用程序。

它提供了针对ViewModelsViews中的数据绑定

例如,它启用以下内容:

 <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" local:MvxBind="{'Text':{'Path':'Query','Mode':'TwoWay'}}" /> 

资源:

Github页面: https : //github.com/slodge/MvvmCross

演示文稿: http : //slodge.blogspot.co.uk/2012/12/mvvmcross-video-presentation-xaminar.html

一个非常好的介绍性教程: 使用MVVM和数据绑定构buildAndroid应用程序

除了Oleksii的回答之外,对于那些希望看到一个示例项目的人(Google似乎还没有提供任何示例项目), 我只做了一个,并将其推送到GitHub。

一些注意事项:

  • classpath "com.android.databinding:dataBinder:1.0-rc0"对我不起作用,所以我使用classpath group: 'com.android.databinding', name: 'dataBinder', version: '1.0-rc0'
  • 需要Java 7 +
  • 如果您遇到错误,请尝试清理/重build。
  • 不要忘记实现android.databinding.Observableextends BaseObservable如果你需要能够通知数据改变。
  • minSdkVersion是7.它是一个支持库。
  • 我的项目不遵循MVVM,它只是使用数据绑定。 增加了MVVM示例。

我意识到这是几年后,但面对同样的问题,我遇到以下可能有助于减轻负载。

RoboBinding – 处理绑定 – 如上所述RoboGuice – 执行dependency injection

有一个非常好的RoboBindingvideo演示,将有助于解释什么和如何。

我与这两项工作都没有任何关系,但是对于那些仍然试图解决具有约束力的问题的人,特别是涉及到的代码,他们确实看起来很有希望。 RoboBinding也处理双向更新。