2016-06-22 69 views
3

在官方的android文檔中 - 有一些指導如何在碎片和活動中使用數據綁定。不過,我有相當複雜的選擇與高設置。喜歡的東西:android在自定義控件中的數據綁定

class ComplexCustomPicker extends RelativeLayout{ 
    PickerViewModel model; 
} 

所以我的問題是選擇器我需要重寫,以便能夠使用其內部約束力,而不是塞汀/檢查單個數值一樣文本框等什麼方法?

第二個問題 - 我如何將viewmodel傳遞給xml文件中的選擇器,我是否需要一些自定義屬性?

回答

2

我認爲使用Custom Setters可以解決您的問題。 Check this section在開發者指南。

我可以給你一個簡單的例子。假設您的視圖的名稱是CustomView和您的視圖模型是ViewModel,然後在您的任何類,創建這樣的方法:

@BindingAdapter({"bind:viewmodel"}) 
public static void bindCustomView(CustomView view, ViewModel model) { 
    // Do whatever you want with your view and your model 
} 

而在你的佈局,做到以下幾點:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="viewModel" 
      type="com.pkgname.ViewModel"/> 
    </data> 

    // Your layout 

    <com.pkgname.CustomView 
    // Other attributes 
    app:viewmodel="@{viewModel}" 
    /> 

</layout> 

從你Activity使用此功能來設置視圖模型:

MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); 
ViewModel viewModel = new ViewModel(); 
binding.setViewModel(viewModel); 

或者你也可以直接從您的自定義視圖膨脹:

LayoutViewCustomBinding binding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.layout_view_custom, this, true); 
ViewModel viewModel = new ViewModel(); 
binding.setViewModel(viewModel); 
+4

好答案!另外,如果你的'ComplexCustomPicker'上有一個setter方法需要'PickerViewModel',那麼你不需要'BindingAdaper'。 Android數據綁定會自動嘗試使用名稱setXxx查找某些內容,其中Xxx是屬性。因此,如果'ComplexCustomPicker'有一個方法'void setViewModel(PickerViewModel)',就可以像上面那樣使用屬性'app:viewModel =「@ {viewModel}」''。這種技術意味着你將你的視圖綁定到你的模型類型,但在你的應用中可能沒問題。 –