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

Rea*_*oid 33 data-binding wpf android

我在发布之前已经搜索了一些类似的问题 - 但是我在Android和数据绑定方面有一个普遍的问题(我检查的其他答案并没有让我更进一步......).假设你有一个类车辆:

public class Vehicle {

private Owner owner;
private String brand;

//getter and setter for above attributes...

}
Run Code Online (Sandbox Code Playgroud)

这是所有者类....

public class Owner {

private String name;

}
Run Code Online (Sandbox Code Playgroud)

现在 - 我最近正在研究微软WPF采用的MVVM(ModelView-ViewModel)模式.这让我想知道:假设我想绑定我的所有者对象的name属性,这是Vehicle对象的子对象 - 在Android中是否会有一些标准方法来实现这一点?还假设,在我可以更新模型之前,我可能必须验证输入?

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

  • 视图(活动)不包含应用程序逻辑 - 因此它或多或少是空的
  • ViewModel将处理Vehicle对象的实例并对其执行操作
  • 模型本身看起来像我之前发布的代码 - 完全忘记了View和ViewModel

现在,当我将EditTexts,TextViews等添加到视图中时,我希望它们绑定到我的上下文对象的某些属性(在这种情况下为Vehicle)......如果我的问题不明确或者您需要进一步的信息,请执行此操作让我知道:)提前谢谢.

Ps我认为熟悉WPF的人现在可能是我的意思吗?我自己刚刚阅读了WPF并发现它是处理内容的好方法.

PPs我知道android绑定项目,但我想知道Android中是否存在某种内置方法,或者某些约定有人关注:)这真的更像是一个绑定理论问题我猜...

Min*_*lli 25

本机数据绑定

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}"/>
Run Code Online (Sandbox Code Playgroud)

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

确定缺少双向绑定(预计不会出现在第一个版本中)是一个很大的缺点.

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


ran*_*tor 14

Android SDK中没有任何"烘焙"功能,它提供了MS WPF中的等效数据绑定功能.谷歌正在为运行Android的各种设备提供更低级别的界面.到目前为止,Android开发社区还没有出现更高级别的应用程序框架.(恕我直言,考虑到所有各种Android设备的框架的所有不同限制,它会像Google这样的怪物公司创建这样的东西.)

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

对您的申请来说,这是否值得做出判断.我的猜测是,编写Databinder类需要更多的努力,而不仅仅是直接挂钩较低级别的View事件处理程序.框架主要在您不必自己编写时很有用.

  • 来自WPF/Silverlight/WP7在Android上运行感觉就像回到GUI石头 - 即使MonoDroid大大减轻了痛苦:) (31认同)
  • _Frameworks主要是在你不必自己编写它们时很有用.这不正是人们首先编写框架的原因吗? (2认同)

xan*_*ndy 14

好吧,我的Android-Binding项目试图通过XML布局进行数据绑定.因为谷歌没有提供内置方法(我无法预见谷歌会这样做),这就是我开始这个项目的原因.


Ole*_* K. 11

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

现在可以在dev-preview版本中使用它.

内部xmljava文件看起来很棒:

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.firstName}"
    />
Run Code Online (Sandbox Code Playgroud)

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

捆绑:

@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);
}
Run Code Online (Sandbox Code Playgroud)

  • 为了澄清,尽管它在M预览中,它实际上是支持库的一部分,因此您可以使用它直到API 7. (4认同)

sas*_*oar 8

阅读一下这个主题,我刚刚找到了RoboBinding,一个适用于Android的"数据绑定演示模型框架".

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

虽然它也没有内置方法,但它对您来说可能是一个很大的帮助.


Tim*_*hyP 7

自从您第一次提出问题以来,景观发生了很大变化.
最重要的是Stuart Lodge给了我们MVVMCross.

该项目提供了基于Silverlight for WP7,Mono for Android和MonoTouch for iOS构建的跨平台mvvm移动开发框架,以及适用于Windows 8 Store应用程序的WinRT XAML框架此项目广泛使用可移植类库来提供可维护的交叉平台C#本机应用程序.

它提供的数据在你的绑定Views反对ViewModels

例如,它启用以下内容:

<EditText
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    local:MvxBind="{'Text':{'Path':'Query','Mode':'TwoWay'}}" />
Run Code Online (Sandbox Code Playgroud)

资源:

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

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

还有一个非常好的入门教程:使用MVVM和数据绑定构建Android应用程序


pt2*_*121 5

除了Oleksii的回答,对于那些想要看样品项目的人来说(似乎谷歌还没有提供任何样品项目),我只做了一个并将其推送到GitHub.

几点说明:

  • classpath "com.android.databinding:dataBinder:1.0-rc0" 不起作用,所以我使用 classpath group: 'com.android.databinding', name: 'dataBinder', version: '1.0-rc0'
  • 需要Java 7 +
  • 如果出现错误,请尝试清理/重建.
  • 不要忘记实施,android.databinding.Observable或者extends BaseObservable如果您需要能够在数据发生变化时通知.
  • minSdkVersion是7.这是一个支持库.
  • 我的项目不遵循MVVM,它只使用数据绑定.添加了MVVM示例.