简体   繁体   中英

Android data-binding (similar to WPF)?

I have searched for some similar questions before posting - however I have a general question when it comes to Android and data binding (and the other answers I check did not really get me much further...). Assume you have a class Vehicle:

public class Vehicle {

private Owner owner;
private String brand;

//getter and setter for above attributes...

}

and here is the Owner class ....

public class Owner {

private String name;

}

Now - I was just recently looking into MVVM (ModelView-ViewModel) pattern as employed by Microsofts WPF. Which got me wondering: Assuming I would want to bind the name property of my owner object which is a child of the Vehicle object - would there be some standard way in Android to achieve this? Also presuming, that I might have to validate input before I can have the Model updated?

I was imagining the following components (assuming MVVM):

  • The View (an Activity) contains no application logic - so its more or less empty
  • A ViewModel would handle the instance of the Vehicle object and perform actions on it
  • The Model itself would look as the code I posted before - totally oblivious to the View and the ViewModel

Now when I add my EditTexts, TextViews and so on to the view, I want them to bind to certain the properties of my context object (Vehicle in this case) ... Mhhh if my question is not clear or you need further informatio do let me know :) thanks in advance.

Ps I think people familiar with WPF might now what I mean? I myself just read about WPF and found it's a nice way to handle stuff.

PPs I am aware of the android binding project but I was wondering if there is a sort of build-in approach in Android or maybe some convention someone is following :) this really is more of a binding-theory question I guess ...

Native Data Binding

Google has launched its native Data Binding Library!

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

Which lets you write your views as such

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

But its event wiring mechanism at this time (rc1 version) can't bind to methods on a class extending from Observable (an exception is thrown when compiling; this is a known bug which will be solved).

And sure the lack of two-way binding (which is not expected to be on the first release ) is a big drawback.

Anyway, here's a good sample project to play around with https://github.com/saleeh93/data-binding-samples

There is nothing "baked" into the Android SDK which provides equivalent databinding functionality found in MS WPF. Google is providing a lower level interface for the various devices running Android. To date, higher level application frameworks have not emerged from the Android development community. (IMHO, it would take a monster company like Google to create such a thing, given all the different constraints on a framework for all the various Android devices.)

You could create a set of databinding classes in your own application to handle your needs for the MVVM pattern. The "Databinders" would set the relevant event handlers on Android View objects and run some appropriate method on your ViewModel objects in response. They would also translate change events (that you define) on the ViewModel into the appropriate property assignments on the View objects.

Whether that turns out to be worthwhile for your application is a judgment call. My guess is that it would require more effort to write the Databinder classes than just to hook the lower level View event handlers directly. Frameworks are useful primarily when you didn't have to write them yourself.

Well, my Android-Binding project is trying to do data-binding via XML layout. Because there's no build-in method provided by Google (and I can't foresee that Google will do so), that's the reason I started this project.

Android M will provide powerful library for data binding!

It's available now in dev-preview version .

It looks amazing inside xml and java files:

<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;
   }
}

Binding:

@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);
}

Reading a bit about this topic, I just found RoboBinding , a "data-binding Presentation Model framework" for Android.

Similar to the Android-binding project, you can bind properties (one-way or two-way) and events to your views in XML using an extra namespace.

Although it is no built-in approach either, it might be a great help for you.

Since you first asked your question, the landscape has changed a lot.
Most importantly Stuart Lodge gave us MVVMCross .

This project provides a cross-platform mvvm mobile development framework built on top of Silverlight for WP7, Mono for Android and MonoTouch for iOS, and the WinRT XAML framework for Windows 8 Store applications This project makes extensive use of Portable Class Libraries to provide maintainable cross platform C# native applications.

It provides data binding in your Views against ViewModels

For example, it enables the following:

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

Resources:

Github Page: https://github.com/slodge/MvvmCross

Presentation: http://slodge.blogspot.co.uk/2012/12/mvvmcross-video-presentation-xaminar.html

And a very good introductional tutorial: Building Android Apps with MVVM and Data Binding

In addition to Oleksii's answer, for those who want to see a sample project (it seems Google hasn't provided any sample project yet), I just made one and pushed it to GitHub.

A few notes:

  • classpath "com.android.databinding:dataBinder:1.0-rc0" doesn't work for me so I use classpath group: 'com.android.databinding', name: 'dataBinder', version: '1.0-rc0'
  • Need Java 7 +
  • If you get errors, try clean/rebuild.
  • Don't forget to implement android.databinding.Observable or extends BaseObservable if you need the ability to notify when data changes.
  • minSdkVersion is 7. It's a support lib.
  • My project doesn't follow MVVM, it just uses data binding. Added MVVM sample.

I realize this is some years later but faced with the same issues I ran across the following which may help lessen the load.

RoboBinding - handles binding - as mentioned above RoboGuice - does dependency injection

There is a very nice video presentation of RoboBinding that will help explain what and how.

I am not affiliated with either effort but they do look promising for those folks still trying to resolve the binding issues, especially on involved code. RoboBinding also handles bidirectional updates.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM