İnclude etiketi kullanarak Android Veri Bağlama


117

Notu güncelle:

Yukarıdaki örnek düzgün çalışır bırakma 1.0-rc4 çünkü sabit gereksiz değişken ihtiyacı konusunu.

Orijinal soru:

Belgelerde anlatıldığı gibi yapıyorum ve çalışmıyor:

main.xml:

<layout xmlns:andr...
    <data>
    </data>
       <include layout="@layout/buttons"></include>
....

buttons.xml:

<layout xmlns:andr...>
    <data>
    </data>
    <Button
        android:id="@+id/button"
        ...." />

MyActivity.java:

 ... binding = DataBindingUtil.inflate...
binding.button; ->cannot resolve symbol 'button'

düğme nasıl alınır?

Yanıtlar:


207

Sorun, dahil edilen düzenin veriye bağlı bir düzen olarak düşünülmemesidir. Tek olarak hareket etmesini sağlamak için bir değişkeni iletmeniz gerekir:

buttons.xml:

<layout xmlns:andr...>
  <data>
    <variable name="foo" type="int"/>
  </data>
  <Button
    android:id="@+id/button"
    ...." />

main.xml:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"
            app:foo="@{1}"/>
....

Ardından, düğmeler alanı aracılığıyla dolaylı olarak düğmelere erişebilirsiniz:

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.button

1.0-rc4 (yeni yayınlandı) itibariyle, artık değişkene ihtiyacınız yok. Bunu şu şekilde basitleştirebilirsiniz:

buttons.xml:

<layout xmlns:andr...>
  <Button
    android:id="@+id/button"
    ...." />

main.xml:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"/>
....

6
1.0-rc4 artık gereksiz değişkene ihtiyaç duyma sorununu çözüyor. Artık sadece kullanabilirsiniz: <include layout="@layout/buttons" android:id="@+id/buttons"/>. Düğme Görünümüne erişebilmeniz için sizin için bir genel alan oluşturması için kimliğe hala ihtiyacınız var.
George Mount

1
Yine de düzende tıklama olaylarını bağlamayla ilgili sorunları olan başka biri var mı?
Nilzor

5
Dahil etme desteği ile veri bağlama. developer.android.com/topic/libraries/data-binding/…
sowmia

1
Burada hatırlanması gereken ana nokta, düğme referansını almaktır, binding.{id of include tag}.buttonbunun yerine yapmanız gerekir binding.button. Anlamam biraz zaman aldı.
Rishabh876

1
@NeonWarge de tam bir örnek vardır developer.android.com/topic/libraries/data-binding/... . "Veri bağlama, bir birleştirme öğesinin doğrudan alt öğesi olarak dahil etmeyi desteklemez" ekliyor
Ewan

38

Kolay Tamamlanmış Örnek

Sadece iddahil edilen düzene ayarlayın ve kullanın binding.includedLayout.anyView.

Bu örnek <include, koda dahil edilen görünümlere bir değer iletmeye ve bunlara erişmeye yardımcı olur .

Aşama 1

You have layout_common.xml, geçirmek istediğiniz Stringdahil düzene.

Sen yaratacak Stringdüzeninde değişken ve bu başvurmak Stringiçin TextView.

<data>
    // declare fields
    <variable
        name="passedText"
        type="String"/>
</data>

<TextView
    android:id="@+id/textView"
    ...
    android:text="@{passedText}"/> //set field to your view.

Adım 2

Bu düzeni ana yerleşim düzenine dahil edin. idDahil edilen bir düzen verin , böylece onu bağlama sınıfında kullanabiliriz. Şimdi Dize geçebilir passedTextsizin için <includeetiketi.

activity_main.xml

<?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">

    <LinearLayout
        ..
        >

        <include
            android:id="@+id/includedLayout"
            layout="@layout/layout_common"
            app:passedText="@{@string/app_name}" // here we pass any String 
            />

    </LinearLayout>
</layout>
  • Şimdi binding.includedLayout.textViewsınıfınızda kullanabilirsiniz .
  • Yukarıdaki gibi herhangi bir değişkeni dahil edilen düzene geçirebilirsiniz.

    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    binding.includedLayout.textView.setText("text");

Not Her iki düzen (üst ve dahil) binding layoutşununla sarmalanmalıdır:<layout


O, bir düğme olurdu eğer cevap size Yerine TextView arasında programlı setText olayı ele o zaman biliyor .Ben onun tıklama etkinliği programlı ele nasıl olurdu binding.includedLayout.button.setOnClickListenerben kullanım istiyorsanız alternatif ama ne olurdu onClickXML özniteliği kendisi?
iCantC

OnClickListenerDahil edilen düzene geçebilirsiniz . siz bile her şeyi bağlayıcı olarak aktarabilirsiniz. Bu yanıtı kontrol edin, daha fazla yardıma ihtiyacınız olursa bana bildirin. stackoverflow.com/a/51722829/6891563
Khemraj

1
Bunu yaptığımda, sadece boş bir alan alıyorum passedText. Tek fark, MainActivity kodunu eklememem, çünkü yalnızca dize kaynağını <include> içine geçirmek ve bu şekilde bırakmak istiyorum. Yine de neden her zaman boş?
Elliptica

3

Bununla ilgili bir başka ilginç şey de, değişkenleri bağlayıcıdan içe aktarılan düzene şu şekilde aktarabilmenizdir:

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.setVariable(BR.varID, variable)

3

Bağlantınızın dahil etmesini sağlayabilirsiniz, sadece buna bir kimlik ekleyerek şu şekilde:

<include
            android:id="@+id/loading"
            layout="@layout/loading_layout"
            bind:booleanVisibility="@{viewModel.showLoading}" />

2

içerme düzeniniz için bir kimlik belirleyin

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

sonra

BUTTONSBINDING binding = yourMainBinding.layout;

BUTTONSBINDING res / layout / buttons.xml'dir

şimdi:

binding.button.setText("simple_Way");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.