2011-05-15 81 views
32

我在發佈之前搜索了一些類似的問題 - 但是當涉及到Android和數據綁定時我有一個普遍的問題(並且我檢查的其他答案並沒有讓我更進一步......)。假設你有一個類車輛:Android數據綁定(類似於WPF)?

public class Vehicle { 

private Owner owner; 
private String brand; 

//getter and setter for above attributes... 

} 

這裏是主人類....

public class Owner { 

private String name; 

} 

現在 - 我最近剛剛尋找到MVVM(模型視圖,視圖模型)的圖案由微軟所採用WPF。這讓我想知道:假設我想綁定車輛對象的子對象的所有者對象的名稱屬性 - 在Android中是否會有一些標準方法來實現這一點?還假設,我可能需要在更新模型之前驗證輸入?

我想象以下組分(假設MVVM):

  • 的視圖(一個Activity)不包含應用邏輯 - 因此其或多或少空
  • 甲視圖模型將處理車輛的實例對象,並對其執行操作
  • 模型本身看起來就像我之前發佈的代碼 - 完全無視查看 和視圖模型

現在,當我將EditText,TextView等添加到視圖中時,我希望它們綁定到我的上下文對象(本例中爲Vehicle)的某些屬性......如果我的問題不清楚或者需要進一步的信息請讓我知道:)提前致謝。

P.s.我認爲熟悉WPF的人現在可能意味着什麼?我自己剛剛閱讀了WPF,發現它是處理內容的好方法。

PPs我知道android binding項目,但我想知道在Android中是否有某種內置方法,或者有人正在遵循某種約定:)這實際上更像是一個綁定理論問題。 ..

回答

13

Android SDK沒有任何「烘焙」,它提供了在MS WPF中發現的等效數據綁定功能。 Google爲運行Android的各種設備提供了較低級別的界面。迄今爲止,Android開發社區尚未出現更高層次的應用程序框架。 (恕我直言,考慮到所有各種Android設備的框架的所有不同限制,需要像谷歌這樣的怪物公司來創建這樣的事情。)

您可以在您自己的應用程序中創建一組數據綁定類,以便處理您對MVVM模式的需求。 「數據綁定」將在Android View對象上設置相關的事件處理程序,並在您的ViewModel對象上運行一些適當的方法作爲響應。他們還會將ViewModel上的更改事件(您定義的)轉換爲View對象上的相應屬性分配。

對於您的應用程序來說是否值得是一個判斷電話。我的猜測是,需要更多的努力來編寫Databinder類,而不是直接掛鉤較低級別的View事件處理程序。當你不需要自己編寫框架時,框架非常有用。

+1

玩弄我認爲「怪物公司」的評估是正確的。 WPF中有大量複雜的數據綁定代碼。 – 2011-05-18 16:43:44

+0

感謝您的答覆 - 是的,我想的很多:(簡單地說,發佈後的問題,我開始有一個想法如何做到這一點 - 它類似於你的建議,我會看到多遠,它讓我:)非常感謝。 – Ready4Android 2011-05-19 07:49:31

+31

來自WPF/Silverlight/WP7在Android上工作感覺像回到GUI的石頭 - 即使MonoDroid大大緩解了疼痛:) – 2011-11-11 18:56:10

14

那麼,我的Android-Binding項目正試圖通過XML佈局來進行數據綁定。因爲沒有Google提供的內置方法(我不能預見Google會這樣做),所以這就是我開始這個項目的原因。

+1

我閱讀了關於你的項目,並檢查了它,但我覺得對我來說更簡單就足夠了。我注意到的一件事是,缺乏評論使我很難理解所有的東西xD ... – Ready4Android 2011-05-20 08:28:18

+0

到目前爲止,我是該項目中唯一的開發人員,因此內聯評論不在我的待辦事項之上。你有沒有試過教程/示例代碼? – xandy 2011-05-21 03:39:57

+0

是的,我做了:)但我試圖理解內部 - 缺乏評論使它有點困難 - 但我猜如果你是唯一的開發者,你知道你在做什麼評論真的可能不是你的第一優先...儘管稍後添加它們也可能不會發生;) – Ready4Android 2011-05-21 09:23:56

7

既然你第一次問你的問題,景觀已經改變了很多。
最重要的是Stuart Lodge給了我們MVVMCross

這個項目提供了一個跨平臺的MVVM移動開發 框架建立在對WP7,單聲道Android和 的MonoTouch於iOS的Silverlight的頂部,爲Windows 8 Store中的WinRT XAML框架 應用 這個項目使大量使用便攜式類庫到 提供可維護的跨平臺C#本機應用程序。

它提供的數據對ViewModels

例如在Views結合,它可以實現以下:

<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

和非常好的introductional教程:Building Android Apps with MVVM and Data Binding

8

閱讀一些關於這個話題,我剛剛發現RoboBinding,「數據綁定演示模型框架」爲Android。

與Android綁定項目類似,您可以使用額外的命名空間將屬性(單向或雙向)和事件綁定到XML中的視圖。

雖然它也沒有內置的方法,但它可能對你很有幫助。

+0

此時是我在Android中使用MVVM的首選框架,即使是新的Google Data Binding Library也是如此... – Minelli 2015-10-15 13:54:05

1

我意識到這是幾年後,但面臨着同樣的問題,我碰到以下可能有助於減輕負載。

RoboBinding - 處理結合 - 如上面提到 RoboGuice - 不依賴注入

有RoboBinding的一個非常不錯的視頻演示,這將有助於解釋什麼,以及如何。

我與這兩項工作無關,但對於那些仍在試圖解決綁定問題的人,特別是涉及的代碼,他們確實看起來很有前途。 RoboBinding還處理雙向更新。

11

Android M將爲數據綁定提供強大的庫!

現已在dev-preview version中提供。

它看起來令人驚訝的內部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); 
} 
+4

澄清一下,雖然它是在M預覽版中,但它實際上是支持庫的一部分,所以你可以直到API 7使用它。 – yigit 2015-05-29 01:58:51

+0

Google在其開發者指南網站上發佈了數據綁定指南:https://developer.android.com/tools/data-binding/guide.html – 2015-05-31 12:43:41

+1

一個重要的警告是它只是單向數據綁定,所以我很漂亮沒用。他們不打算在v1中實現雙向綁定: https://code.google.com/p/android-developer-preview/issues/detail?id=2095&sort=-stars&colspec=ID%20Type%20Status%20Owner %20Summary%20Stars – Richard 2015-06-10 09:05:25

5

除了奧萊克西的回答,對於那些誰想要看到一個示例項目(Google似乎沒有提供任何示例項目oject還),I just made one and pushed it to GitHub.

的幾個注意事項:

  • classpath "com.android.databinding:dataBinder:1.0-rc0"不爲我工作,所以我用classpath group: 'com.android.databinding', name: 'dataBinder', version: '1.0-rc0'
  • Need Java 7 +
  • 如果出現錯誤,請嘗試清潔/重建。
  • 如果您需要在數據更改時通知您,請不要忘記實施android.databinding.Observableextends BaseObservable
  • minSdkVersion是7.它是一個支持庫。
  • 我的項目不遵循MVVM,它只是使用數據綁定。 添加了MVVM示例。
25

本地數據綁定

谷歌已經推出了其原始數據綁定庫!

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(編譯時拋出異常;這是將被解決的known bug)。

並確定沒有雙向綁定(預計不會在first release上)是一個很大的缺點。

不管怎麼說,這是一個很好的樣本項目,https://github.com/saleeh93/data-binding-samples

+0

不幸的是,它打破目前Robolectric ... – Philio 2015-06-03 22:15:00

+0

有人成功地與本機數據綁定庫進行雙向綁定? – 2015-06-03 22:46:33

+1

@kosiara尚未支持雙向數據綁定。可能會在下一個版本。您可以按照[這裏]的狀態(https://code.google.com/p/android-developer-preview/issues/detail?id=2095&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars)。 – 2015-06-04 03:23:20