2015-10-20 11 views
6

Gram z Android databinding library i próbuję go użyć z dołączonymi układami.Jak uzyskać widoki z Androidem Databinding?

Kod mam to tak:

activity_main.xml

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

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id = "@+id/linearLayout"> 

    <include 
     layout="@layout/view" /> 
    </LinearLayout> 
</layout> 

view.xml

<View xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id = "@+id/myView"> 
</View> 

MainActivity.java

public MainActivity extends AppCompatActivity{ 

    private ActivityMainBinding mBinding; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); 

    LinearLayout layout = mBinding.linearLayout; // this field is visible 
    View myView = mBinding.myView // THIS FIELD IS NOT VISIBLE 
    } 


} 

Jak pisałem w komentarzach v iew myView, który jest zadeklarowany w "włączonym" układzie, nie jest widoczny. Jeśli zamieniam na rzeczywisty kod w pliku view.xml, to mBinding.myView staje się widoczny, dlatego wydaje się, że jest to włączanie.

urzędowa dokumentacja tylko że

„Powiązanie danych nie obsługuje to jako bezpośrednie dziecka elementu seryjnej.” ale w moim przypadku Widok jest dzieckiem LinearLayout, nie jest to bezpośrednie dziecko ..

Jakieś wskazówki?

Odpowiedz

14

Musisz podać identyfikator do include:

<include android:id="@+id/included" 
    layout="@layout/view" /> 

Teraz można uzyskać dostęp to pogląd:

View myView = mBinding.included; 

Jeśli włączone układ jest układ wiążący, include będzie wygenerowane wiązanie. Na przykład, jeśli view.xml jest:

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <View 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@{@android:color/black}" 
     android:id="@+id/myView"/> 
</layout> 

wówczas pole układ będzie klasa ViewBinding:

View myView = mBinding.included.myView; 
+0

Jak mogę zrobić to samo, ale dla dwóch układów o tej samej nazwie, to do układu o pokrowiec na tablet. Mam na myśli, gdy mam dwa układy o nazwie 'layout/layout.xml' i' layout-sw600dp/layout.xml', ale drugi ma kontener 'FrameLayout' dla fragmentów, ten ostatni nie pojawia się w klasie generującej powiązania. Wcześniej dzięki. – epool

+1

Jeśli masz widok w jednym układzie, ale nie w obu, powinieneś zobaczyć widok w klasie, ale będzie on pusty, gdy jeden układ jest powiązany. Upewnij się, że podajesz identyfikatory do widoków, które chcesz mieć jako właściwości. –