Veri Bağlama sınıfı oluşturulmadı


104

Projemde Veri Bağlama kullanıyorum, kullanırken <layout>ve <data>xml bağlama sınıfım oluşturulmuyor.

Örneğin, activity_main.xml var

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>    </data>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </RelativeLayout>
</layout>

Şimdi eğer ActivityMainBindingetkinliğimde / parçamda yazıyorsam , sınıfın mevcut olmadığı hatasını gösteriyor. Ancak <variable>xml dosyama ekledikten sonra ActivityMainBindingsınıf oluşturabilir .

Android Studio: 2.1.3 Sınıfyolu
: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0


2
olduğu dataBinding.enablediçin build.gradle içinde?
pskink

2
Bunun bilinen bir hata olduğunu düşünüyorum. Erişmeye çalışmadan önce projenizi oluşturmayı deneyebilirsiniz ActivityMainBindingveya bu hata ile bir şeyler yapması gerekir .
yennsarah

@pskink evet o ekledikten sonra bağlama sınıfını oluşturuyor neden olduğu <variable>xml
Ravi

@Amylinn projemi oluşturduktan sonra oluşturuyor, ancak sorum şu ki yazdığımda <variable>proje oluşturmadan bağlama sınıfı üretiyor.
Ravi

1
Gerçek soru hakkında kafam mı karıştı? <değişken> eklemek sorunu çözüyorsa, neden bunu yapmıyorsunuz? ViewModel (<variable>) olmadan bağlama noktasını
anlamıyorum

Yanıtlar:


244

Tatmin edici cevaplar almadım. İşte veri bağlama bilgimin özeti olan ipuçları.

Veri Bağlama Sorunlarını Çözme İpuçları

Güncelleme

Daha doğru hatalar ve öneriler almak için Android Studio ve Gradle eklenti sürümünü en son sürüme güncellemenizi şiddetle tavsiye ederim. Çünkü AS 3.2 sürümünden sonra pek bir sorunla karşılaşmıyorum.

Bkz son Android Studio ve son Gradle Plugin .

Orijinal Çözüm

Bu yanıtı okuduktan sonra, hem Sınıflar hem de Veri Değişkenleri için veri bağlama otomatik oluşturma sorunlarında takılıp kalmayacaksınız .

Bu noktaları tek tek kontrol edin. Bunlardan herhangi biri işinizi halledebilir. Sondan 3'e kadar olan nokta gerçekten önemli, bu yüzden onları kaçırmayın.

1. Veri bağlamanın etkin olup olmadığını kontrol edin

Sen olmalıdır verileri etkin bağlanma bölgesi build.gradle. Değilse, bunu ekleyin ve Senkronize edin .

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

2. Çek düzeni cilt düzenine dönüştürülür

Şimdi, veri bağlama sınıfının oluşturulmasını istiyorsanız , veri bağlama ( etiket) ile sarmalamanızxml layout gerekir <layout. Bunun gibi bir şey.

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

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.constraint.ConstraintLayout>
</layout>

Bununla birlikte, bağlama değişken adlarının görünüm modeli sınıfındaki gibi doğru olup olmadığını kontrol edin

3. Otomatik oluşturulmuş Binding sınıfı adı?

Veri bağlama sınıfınız, bağlama düzeni oluşturulduktan sonra oluşturulmalıdır.

Mizanpaj adınız yılan durumunda activity_main.xml ise, deve durumunda gibi veri bağlama sınıfı üretilecektir ActivityMainBinding.

4. İçe Aktarma Önerisini Göremiyor musunuz?

Yazarken Bazen ActivityMai..., o zaman öneriyi göstermez o durumda, elle ithalat .

import <yourpackage>databinding.ActivityMainBinding;

5. Build Fail Logcat'i okuyun

Derlemeniz başarısız olursa bağlama sınıfınız ve düzendeki yeni değişkenler oluşturulmaz. Yani ilk yap projesi ile Ctrl + F9 (Yapı> yap projesi) .

  • Bir yapı başarısız olursa, hatanın ne olduğunu görün, genellikle yerleşim alanlarında hatalarımız olur. Hata günlükleri, sorunla ilgili hata satırı numarasını gösterecektir.
  • Bağlama başarısız olabilir , sözdizimi hatası veya eksik içe aktarma gibi bazı aptalca hatalara neden olabilir . Bu durumda, sınıfları bağlama hatalarıyla dolu logcat alırsınız. Ancak uygun sorunu bulmak için tam logcat okumalısınız .

6. En son gelen projeyi kapatın ve açın

Bunu her zaman yapıyorum çünkü Rebuild/ project'ten çok daha az zaman alıyor Make.

  • Dosyadan projeyi kapat> Projeyi Kapat
  • En sondan tekrar aç

O Not tercihim kapatıp açmak gelen son o çok daha az zaman alır, çünkü Yeniden / Yeniden IDE .

7. Yeniden Oluşturma Projesi

Hala sınıfınız oluşturulmadıysa. (Düzen dosyasını yapıştırdığımızda bir süre sonra olur). Sonra Projesi Yeniden dan Build> Rebuild( kurmak veya yap projesi değil ). Veri bağlama sınıfınızı oluşturacaktır. ( Rebuild benim için Sihir yapar. )

8. En son Android Studio'ya sahip olun

AS'yi Android Studio 3.2'ye güncelledikten sonra , veri bağlama otomatik oluşturmada birçok hatanın düzeltildiğini hissettim. Yani en son AS'ye sahip olmalısınız.

# Çözüm <variables

<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>

Genellikle, düzene bir değişken koyduğumuzda, onun bir alıcı ve ayarlayıcısını oluşturur. Ve biz kullanabilir binding.setItem(item);ve binding.getItem();ancak bu yöntemleri göremiyorsan sonra bilgi aşağıda okuyun.

1. En son

Bir veri değişkeni oluşturduysanız - <variablemizanpajınızda ve veri bağlama sınıfında ayarlayıcısını ve alıcısını göstermiyorsa , Son projenizden Kapat ve Aç .

2. Türü değiştirdikten sonra projeyi temizleyin

<variableDüzeninizde bazılarının türünü değiştirdiyseniz ve alıcı ayarlayıcı türü değişmiyorsa, projeyi temizle ( Build> Clean Project)

Son sözler

Son olarak, hala bağlayıcı sınıfınız oluşturulmadıysa, o zaman en güçlü silahımıza sahibiz. - Android Studio'yu yeniden başlatın: D

  • İlk olarak, sadece yeniden başlatmayı deneyin , bu her zaman yeniden başlattıktan sonra bağlama düzenimin değişkenlerini oluşturur.
  • O zaman işe yaramazsa Geçersiz Kılan Cache & Yeniden Başlat .

Veri bağlama hatalarımı çözmek için yaptığım tek şey bu. Başka sorunla karşılaşırsanız, buradan yorum yapabilirsiniz.


2
Sorun devam ederse ... (8) Geçersiz kıl ve yeniden başlat .... çözülmediyse, (9) dataBinding'i değiştir {enabled = false} ... oluştur ve sonra dataBinding {enabled = true} yeniden oluştur ...
PravyNandas


1
Benim durumumda, IDE'nin bunu bir çözüm olarak göstermemesi nedeniyle sınıf yolunu manuel olarak içe aktarmak zorunda kaldım. Tnx :)
Ivan

2
Günümü kurtardım. Düzen dosyamda <layout> sarmalaması eksikti. Teşekkür ederim!
Juliano

İçe aktarma listesinin bir parçasıysa, "ithal android.R" nin kaldırılması gerektiğini de ekleyebilirsiniz. Bu, etkinlik xml dosyasına Çözümlenmemiş referansla ilgili sorunumu çözdü
Tim John

23

DataBinding sınıfı otomatik olarak oluşturuldu.

xml adınız activity_test ise, Binding sınıfı ActivityTestBinding olacaktır.

fakat,

dataBinding {
        enabled = true
    }

düzen, kök düzenine sahip olmalıdır

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

Saatlerdir ruhu arıyorum, çok fazla gradle büyüsü yapıyorum ama ConstraintLayoutkök olarak kullanıyorum . Teşekkür ederim!
Alexey Markov

14

Ben de aynı sorunu yaşadım. Android sdk belgelerini okuduktan sonra, yalnızca oluşturulması beklenen dosya adı vardır, ancak gerçekleşmezse ne yapılacağı hakkında hiçbir şey yoktur. Biraz daha araştırdıktan sonra, ad alanını aşağıdaki gibi düzen öğesine kaldırdıktan sonra (örneğinizi kullanarak) benim için işe yaradığını fark ettim.

    <?xml version="1.0" encoding="utf-8"?>
    <layout>
        <data>  </data>
        <RelativeLayout
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
           android:layout_height="match_parent">
        </RelativeLayout>
    </layout> 

10

Benim durumumda, Binding sınıfı oluşturuldu ve yerinde (ama olmadığını düşündüm) ... ancak söz konusu sınıfın içe aktarımını etkinlik / parça içe aktarma bölümüne otomatik olarak eklemiyor ... yani ... OPTION + GİRİŞ :)


2
Bingo, benim için çalıştı, ancak içe aktarmayı manuel olarak yazmam gerekse de, intellisense herhangi bir nedenle seçeneği sunmuyordu.
Rob

8

Düzgün bir şekilde kurduktan sonra (xml ad alanı ve her şeyi içine yerleştirme dahil <layout>), benim için çalışan biri Build -> Make project yapıyordu. Temiz Proje veya Yeniden Oluşturma Projesi de işe yaramadı. 26.0.2 derleme araçlarını kullanarak Android Studio 2.3.1'deyim. Etikete gerek yok <data>.


Bu doğru cevap olarak işaretlenmelidir. Geri kalanı sadece geçici çözümlerdir. Ad alanlarını taşımaya ve hatta veri öğesi eklemeye gerek yok
Vicky Kapadia

8

Eğer baz işi yaparsanız, kullanım gibi, projenizde databainding etkinleştirmek için gradle etkinleştirmek ve kullanmak xml düzeni etiketinin size xml kodunu değiştirmek zaman ve bu xml için değil generat yeni veri bağlama sınıf yaptı sadece veri nesil için hızlı bir şekilde kullanabilirsiniz sınıfı bağlama gradle-> diğer-> databindinggenbaseclassesDebug hızlı daha build projenin tamamı olmadığı kadar. sadece veri bağlama sınıfını oluşturur. görüntü açıklamasını buraya girin


4
dataBinding {
        enabled = true
    }

Yeni veri bağlama derleyicisini etkinleştirmek için, gradle.properties dosyanıza aşağıdaki seçeneği ekleyin:

android.databinding.enableV2=true

3

Veri bağlama sınıfları, derleme sırasında oluşturulur, bu nedenle uygulamanın Gradle yapısında veri bağlamayı etkinleştirdikten ve xml'nizi düzen etiketiyle çevreledikten sonra uygulamanızı yeniden oluşturmanız gerekir. Bu yardımcı olmazsa, derleme klasörünüzü silin ve tekrar yapın.


2

Senin için işe yarayıp yaramayacağını bilmiyorum. Sadece adlandırmak Düzen XML dosya adı. Yerleşim adınızın activity_main.xml olduğunu varsayalım, sadece main.xml gibi bir isimle değiştirin ve tekrar activity_main.xml olarak yeniden adlandırın . Ardından ActivityMainBinding'de içe aktarma seçeneğini görebilirsiniz .

Umarım sizin için çalışır.


2

Buradaki bu yanıt sayesinde - "yerleşim ad alanının " kaldırılması veya yeni bir benzersiz ada ihtiyacınız var gibi görünüyor .

Benim için işe yarayan seçenekler şunlardır:

  1. Oluşturulabildiğinden emin olmak için düzen için yeni bir ad oluşturun. Bu , veri bağlamadan ilk oluşturulan bir düzenim olduğu sorunumu çözdü - hadi diyelim fragment_abc.xml. Ona veri bağlama eklemeye çalıştığımda, birden çok temiz önbellek ve yeniden başlatma çağrısından sonra bile tanınmadı. Ancak, düzenin bir kopyasını fragment_abc2.xmloluşturduğum anda, oluşturulan veri bağlama .java / .class nesnesini hemen aldım.

  2. Yukarıdaki çalışmayı gördükten sonra, modülden / build klasörünü kaldırmaya ve projeyi yeniden oluşturmaya çalıştım - bu, orijinal düzen için veri bağlamayı elde etmek için çalıştı.


1

Mümkünse hayal edebileceğim tek şey, sahip olmadığın

dataBinding {
    enabled true
}

gradle dosyanızda. Sadece gradle dosyasına eklemek değilse. yani

android {
  ......

  dataBinding {
    enabled true
  }
}

ardından projenizi senkronize edin. Hala başarısız olursa, android stüdyonuzun geçersiz kılınması / yeniden başlatılması gerekebilir.


Sorumda açıkça belirtmiştim ki <variable>xml ekledikten sonra Binding sınıfı oluşturuyor, bu nedenle dataBindinggradle dosyasına eklememe durumu yok , eğer eklemediysem bağlayıcı sınıf oluşturmamalıdır.
Ravi

Senkronize etmeden ve yeniden başlatmadan önce. Lütfen 'Yapmayı' deneyin. Bu işe yarayacak.
Nizamudeen Sherif

1

Çok modüllü bir Android uygulamasıyla çalışırken bağlama sınıfı yolunuzu kontrol edin. Belki kullanmalısın:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding anılan:

import com.yourcompany.app.android.databinding.FragmentABCtBinding


1

Düzenleri silin ve geri alın ve oluşturulan bağlama sınıflarının bundan sonra doğru şekilde içe aktarıldığından emin olun.


1

Benim çözümüm sınıf adında FragmentBinding sonekini almaktı.

Her pafta dosyası için bir bağlama sınıfı oluşturulur. Varsayılan olarak, sınıfın adı, mizanpaj dosyasının adına dayanır, onu Pascal durumuna dönüştürür ve buna Bağlama soneki ekler. Yukarıdaki düzen dosya adı activity_main.xml'dir, bu nedenle ilgili oluşturulan sınıf ActivityMainBinding'dir. Bu sınıf, pafta özelliklerinden (örneğin, kullanıcı değişkeni) mizanpajın görünümlerine kadar tüm bağlamaları tutar ve bağlama ifadeleri için değerlerin nasıl atanacağını bilir.

Etkinlik veya parça sınıfının isimlendirmesi, önekler açısından farklılık gösterebilir. Çünkü sonek her zaman Bağlayıcıdır.

Tepkisini izledikten sonra Khemraj ve Geçersiz Kılan Önbellekler / Yeniden Başlat , sen ActivityBinding veya FragmentBinding yazarsın bundan zaten üretildi ve içe hardcode YAPMAYIN sınıfların IDE öneri almak için.

Benim durumumda ben sınıf geriye olmak adını içe çalışıyordu FragmentCompetitionsBindingyerine CompetitionsFragmentBinding.

GL

Kaynak


1

Eğer cevap sizin için işe yaramadı, sonra benim tavsiye basit ama etkili.

Buradaki fikir, sorunu oluşturan bileşenin hangisi olduğunu belirlemektir. Senin tüm hatlarda bu, yorum yapmak için custom_fragment.xmlve onun kullanımları içinde CustomFragment.ktaşağıdaki gibi ve izni şey minimalist.

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

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</layout>

Ardından uygulamayı çalıştırın ve siz Apply Code Changes(Ctrl + Alt + F10) uygulama çökene kadar, yani siz hatayı bulana kadar bileşene bileşen ekleyin .

Veri bağlama günlükleri bazen çok açıklayıcı değildir ve bu hatalı bileşeni bulmak için genel bir stratejidir.

GL


0

Aynı problemim vardı. Doğru yaptığın her şey. Şey, xml'deki veri etiketinin içine değişken eklemeniz gerektiğidir. Bunun için bir örnek model sınıfı oluşturmalı ve bunu veri etiketine değişken olarak eklemelisiniz.

O zamana kadar oluşturulan ActivityMainBinding'i göremezsiniz.


0

Düzeni sarmaladığım ve gradle dosyasında veri bağlamamın etkinleştirildiği benzer bir sorun yaşadım. Ana faaliyet hâlâ derslerimi anlayamıyor veya göremiyordu. Benim için düzelten şey, bağlama değişkenini eklemek ve yine de bağlamayı içe aktarmaktı. Oradan sadece çözümü geliştirdim ve sonra sınıfın ne olduğunu biliyor gibiydi. Oradan üretilen deve kasa sınıflarımı içeri aktarabildim.


0

Sorunu anladım ve sorun düzendeydi, kullanılan alan bir Dize değildi, bir Tarihti.

Görünüşe göre, tüm alanın çalışması için metin olması gerekiyor, en azından TexView bileşeni ile.

./Gradlew build --stacktrace komutuyla derlerseniz

Bu, hataları daha iyi gösterir.


0

Benim durumumda, üretilen sınıfın her zamanki sınıflarımla görünmesi gerektiğini düşündüm. src klasörde . Ayrıca üretilen sınıfın adının biraz farklı olması gerektiğini düşündüm. Hepsi benim hatamdı. Oluşturulan sınıf, buildklasör, build -> generated -> ...yol içinde bulunabilir . Etkinliğinizde oluşturulan sınıfın içe aktarılması yoksa, içe aktarmayı ekleyin

import com.yourcompany.app.databinding.ActivityMainBinding;"

0

DataBindingUtil.setContentView'da aşağıdaki hatayı almanız durumunda

Çözümlenmemiş referans: activity_main

Tek yapmanız gereken aşağıdaki import ifadesini kaldırmak

android.R'yi içe aktar

Çözümü başka bir forumda buldum. Kaynak


0

Son zamanlarda herhangi biri mevcut projeyi androidx'e taşıdıysa , içe aktarma işleminizi buradan değiştirmeniz gerekir.

import com.yourpackagename.BR;

-e

import androidx.databinding.library.baseAdapters.BR;

Google 2 gün sonra nihayet çözüme kavuştu, hangisi benim için çalışıyor.


1
Hayır . Kaynak ( .R. ) Gibi Bağlama Kaynağı ( .BR. ). Proje kaynağınıza (id, çizilebilir, renk, ...) göre oluşturulmuştur, böylece proje paketinizin ( your.project.package.BR) içine yerleştirilecektir . Gibi üçüncü taraf kitaplığında değil androidx.databinding.library.baseAdapters.BR.
dphans

0

Oluşturulan dizinin altında bir dosya görmeyeceğiniz durumlar vardır, viewmodel'de bildirilmemiş bir özelliği bağlıyor olabilirsiniz. Bunu xml'de yaparsanız, aslında size bir tüy bırakma hatası vermez.


0

Seri hale getirilebilir -> uyguluyorsanız, Serializable'ı

aksi takdirde bu hatayı alırsınız. Umarım gelecekte birine yardımcı olur

Benim durumumda Parcel kitaplığını kullanıyorum. Alt sınıfımda @Parcel'e açıklama eklemeyi özledim


0

Yukarıdaki adımlara ek olarak, değişken türünü de kontrol edebilirsiniz. TextView için String olduğundan veya BindingAdapter. Örneğin:

data class MyDataObject(val name: String, val age: Int)

ve XML'de:

android:text="@{dataobject.age}"

Bu, yukarıdaki hataya neden olacaktır. Düzeltmek için ya String türünde yaş değişkenini yapabilir ya da String'i XML'inize içe aktarabilir ve String.valueOf(age)aşağıdaki gibi kullanabilirsiniz :

<data>
    <import type="String" />
...
</data>

Ve Metin Görünümünüzde:

android:text="@{String.valueOf(dataobject.age)}"

0

Benim durumumda, mipmap Android Kaynak Dizini'ni silmiş olduğum için veri bağlama sınıfları oluşturulmadı. Res / mipmap / dizinini yeniden oluşturdum ve veri bağlama sınıfları eski haline getirildi.


0

DataBinding'in BindingImpl sınıfını oluşturmada başarısız olduğu benzer bir sorunla karşılaştım . Benim durumumda, veri sınıfındaki bir yöntemden kaynaklanan, adın yanlış kullanıldığı bir sorun vardı: Model, onSignInCliked () ve onSigninCliked () kullandığım düzende bir yöntem içeriyordu . Dikkat signin vs signin .

Hata mesajı yeterli değildi ve sorunu yalnızca yığın izleme seçeneğiyle derleme komut dosyasını kullandığımda keşfettim.


0

Veri bağlamanın etkinleştirildiğinden emin olun

android {
...
   dataBinding {
        enabled = true
    }
...
}

Projeyi gradle ile senkronize et dan düğmesine tıklayın (Projeyi Gradle ile senkronize edin)


0

XML dosyası ile ilgili bir sorun varsa, veri bağlama sınıfı olmaz üretilebilir. Hızlı bir düzeltme, XML dosyası üzerinde çalışmak ve sözdizimi hatalarını (genellikle kırmızıyla vurgulanan) kontrol etmek olacaktır. Hatalar, mevcut olmayan veya yanlış referanslar, yazım hataları vb. Şeklinde gelebilir.

Temelde, XML kodunuzda altı kırmızı çizgi olmadığından emin olun. Bitirdiğinizde, yeniden oluşturun ve Databinding sınıfınız üretilirdi.


-1

1. Uygulama notunda Aşağıya Ekle

 dataBinding {
        enabled = true
    }

2. xml düzeninde aşağıdaki kodu yazın

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
  <data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.

3
Genel bir durumda dataBinding neden internet izni gerektiriyor?
M.Pomeroy

1
Gerekli olmasa evet @ M.Pomeroy, cevap sayesinde düzenlemediyse
Rohan Lodhi

-5

'com.android.databinding: dataBinder: 1.0-rc0' sınıf yolunu kullanın


1.5.0 ve üzeri sınıflar için bu sınıf yolunu kullanmaya gerek yoktur.
Ravi
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.