2016-10-05 14 views
11

Chcę użyć jednego z moich układów wiele razy w tym samym widoku przy użyciu include. Załóżmy, że mam custom.xml, w tym niektóre z TextView s.Dołącz znacznik i dataBinding

custom.xml:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="10dp" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/text1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/text2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

mam włączone Ten układ kilka razy w parent.xml:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <include layout="@layout/custom" 
     android:id="@+id/layout1"/> 

    <include layout="@layout/custom" 
     android:id="@+id/layout2"/> 
</LinearLayout> 

Teraz chcę związać moje modele danych do tego układu, ale problemem jest to, że don” • wiedzieć, jak powiązać dwa różne modele danych z layout1 i layout2, ponieważ oba są ponownie zapisywane z jednego układu, który jest custom.xml. O ile wiem, że mogę dodać ten tag w moim układ xml:

<data> 
     <variable name="user" type="com.myproject.model.User"/> 
    </data> 

Ale muszę wiązać dwa różne modele danych do custom.xml.

Moje pytanie brzmi: w jaki sposób uwzględnić wielokrotnie układ w jednym widoku i przekazywać do niego różne dane za pomocą funkcji powiązania danych? coś jak przekazywanie danych do układu, ale nie statyczne wiązanie modelu do xml.

Znalazłem również this pytanie, które ma dokładnie ten sam problem Ale odkąd Data Binding jest wydany w nowszych wersjach Androida, szukam sposobu rozwiązania tego samego problemu za pomocą Data Binding. Oto część tego pytania, że ​​mam cytowany dla wyjaśnienia:

Na przykład, mam starannie spreparowane układ, który chcę wyświetlić trzy razy w moim zdaniem. Każda z tych instancji wymagałaby różnych wartości: . Ponieważ kod include jest w zasadzie zbiorem XML i wklejeniem go tutaj, potrzebuję czegoś mocniejszego.

+0

Jeśli układy są takie same, a jedynie dane zmienia się, dlaczego nie można rozważyć przy użyciu niestandardowego recycleView? –

+0

ponieważ chcę przekazać dwa różne modele danych, na przykład jeden to Użytkownik, a drugi to Adres, ale oba modele używają tego samego układu, aby pokazać swoje dane. –

Odpowiedz

22

można przekazać, że od parent.xml

<include layout="@layout/custom" 
    android:id="@+id/layout1" 
    app:user="@{object of user1`}"/> 

<include layout="@layout/custom" 
    android:id="@+id/layout2" 
    app:user="@{object of user2`}"/> 

Tu trzeba przejść User obiekt z parent.xml

Upewnij się, że <data> w custom.xml

<data> 
    <variable name="user" type="com.myproject.model.User"/> 
</data> 

Here jest szczegółowa odpowiedź związana z jest, przekazać ją

+0

Dzięki za odpowiedź Jest to tak blisko ostatecznej odpowiedzi, ale czy możliwe jest przekazanie dwóch rodzaje modeli (na przykład jeden to Użytkownik, a drugi to Adres) do custom.xml? –

+0

tak, w takim przypadku musisz wziąć dwie zmienne w 'custom.xml' –

+0

coś podobnego do tego?

0

Problemem jest to, że zawiera układ nie jest uważany za związany układ danych, take a look here do undertstand jak go rozwiązać

+1

Dzięki za użyteczny link, ale myślę, że w odpowiedzi musisz podać więcej opisu –

4

Wiemy jak używać nazwy POJO i jego typ na XML, którego używamy w widoku setContentView() jako widoku nadrzędnym. Powinniśmy skupić się na znaczniku include jeśli jesteśmy w tym żadnych układów z zasobów w sposób następujący:

<?xml version="1.0" encoding="utf-8"?> 

<layout xmlns:bind="http://schemas.android.com/apk/res-auto"> 

    <data> 

     <variable 
      name="user" 
      type="exapmpe.model.User" /> 
    </data> 

    <android.support.design.widget.CoordinatorLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:theme="@style/AppTheme.AppBarOverlay"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="?attr/colorPrimary" 
       app:popupTheme="@style/AppTheme.PopupOverlay" /> 

     </android.support.design.widget.AppBarLayout> 

     <include 
      layout="@layout/content_main" 
      bind:user="@{user}" /> 

    </android.support.design.widget.CoordinatorLayout> 

</layout> 

Tutaj mamy użyć atrybutu bind aby przekazać obiekt, aby wyświetlić szczegółowe informacje na ekranie treści.Upewnij się, że nazwa obiektu powinna być taka sama w obu miejscach, takich jak bind:user="@{user}. content_main.xml powinien wyglądać następująco:

<?xml version="1.0" encoding="utf-8"?> 

<layout> 

    <data> 

     <variable 
      name="user" 
      type="exapmpe.model.User" /> 
    </data> 

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/content_main" > 

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

    </RelativeLayout> 

</layout>