2016-12-01 94 views
2

Android文檔在描述如何使用佈局xml文件創建綁定類方面做得很好。但我有幾個問題。Android數據綁定以編程方式實例化視圖

有沒有辦法爲編程實例化的自定義視圖創建數據綁定類?例如,假設我有兩個自定義視圖類,並且我想以編程方式將相同的視圖模型對象綁定到它們而不使用任何xml。這些類如下:

class MyViewModel { 
} 

class MyCustomView extends View { 
} 

class MyAnotherCustomView extends MyCustomView { 
} 

現在讓我們說我實例MyCustomView/MyAnotherCustomView使用:

MyCustomView customView = new MyCustomView(context); 

如何去使用數據在這種情況下綁定?這可能使用官方的Android數據綁定框架嗎?如果沒有,還有哪些其他框架/庫可用或推薦實現這一目標?

我的第二個問題是對第一個問題的跟進。讓我們說在我的第一個問題中不可能實現我想要的。然後,我將不得不定義一個my_custom_view.xml文件。這將是這個樣子:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable name="user" type="com.example.User"/> 
    </data> 
    <com.example.name.MyCustomView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="@{user.firstName}"/> 
</layout> 

現在,如果我想使用MyAnotherCustomView這是MyCustomView的保持綁定邏輯相同的一個子類,我必須要創建一個新的XML文件my_another_custom_view.xml只是爲了取代MyCustomView MyAnotherCustomView來定義相同的綁定?

+0

看到'DataBindingUtil#綁定(查看根)' – pskink

+0

我已經檢查了,但它似乎並沒有幫助我的使用情況。你能發表一個有效的例子嗎?也許這將有助於澄清事情。謝謝! – androholic

+0

'「,我想要將相同的視圖模型對象以編程方式綁定到它們,而不使用任何xml'」哦,對不起,我錯過了,那麼你究竟想要達到什麼目的?綁定僅在xml中定義,那麼您如何定義數據和視圖之間的映射? – pskink

回答

4

第一個問題的答案是「否」 Android數據綁定需要XML來生成綁定類。

在第二個問題中,您提供了一個可行的解決方案。如果你走這條路線,一種方法是使用ViewDataBinding基類設置器來設置你的變量。我能想象這樣的方法:

public void addCustomView(LayoutInflater inflater, ViewGroup container, User user) { 
    ViewDataBinding binding = DataBindingUtil.inflate(inflater, 
     this.layoutId, container, true); 
    binding.setVariable(BR.user, user); 
} 

這裏,我認爲它的自定義視圖是由場layoutId確定的選擇。每種可能的佈局都必須定義一個user變量User

我不知道您使用的具體情況,但如果您想動態選擇要加載的自定義視圖,則可以使用ViewStub。如果您在加載自定義視圖時沒有任何巨大的開銷,那麼您也可以通過可見性來做同樣的事情。

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <data> 
     <import type="android.view.View"/> 
     <variable name="user" type="com.example.User"/> 
     <variable name="viewChoice" type="int"/> 
    </data> 
    <FrameLayout ...> 
     <!-- All of your outer layout, which may include binding 
      to the user variable --> 
     <ViewStub android:layout="@layout/myCustomView1" 
       app:user="@{user}" 
       android:visiblity="@{viewChoice == 1} ? View.VISIBLE : View.GONE"/> 
     <ViewStub android:layout="@layout/myCustomView2" 
       app:user="@{user}" 
       android:visiblity="@{viewChoice == 2} ? View.VISIBLE : View.GONE"/> 
    </FrameLayout> 
</layout> 
+0

太棒了!謝謝喬治。我認爲你提到的解決方案足以滿足我的要求。 – androholic

相關問題