Kelas Data Binding tidak dibuat

97

Saya menggunakan Data Binding dalam proyek saya, saat menggunakan <layout>dan <data>di kelas mengikat xml saya tidak dibuat.

Misalnya saya punya activity_main.xml

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

Sekarang jika saya sedang menulis ActivityMainBinding di aktivitas / fragmen saya, itu menunjukkan kesalahan bahwa kelas tidak tersedia. Tetapi setelah memasukkan <variable>file xml saya, itu dapat menghasilkan ActivityMainBindingkelas.

Android Studio: 2.1.3 Jalur Kelas
: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0

Ravi
sumber
2
ada dataBinding.enableddi build.gradle Anda?
pskink
2
Saya pikir ini adalah kesalahan yang diketahui. Anda dapat mencoba membangun proyek Anda sebelum mencoba mengakses ActivityMainBinding, atau proyek tersebut harus melakukan sesuatu dengan bug ini .
yennsarah
@pskink ya itu, itulah mengapa itu menghasilkan kelas yang mengikat setelah menambahkan <variable>dalam xml
Ravi
@Amylinn setelah membangun proyek saya, itu menghasilkan, tetapi pertanyaan saya adalah ketika saya menulis <variable>, itu menghasilkan kelas yang mengikat tanpa membangun proyek.
Ravi
ah, memang, saya melewatkannya
pskink

Jawaban:

216

Saya tidak mendapatkan jawaban yang memuaskan. Jadi berikut adalah tips yang merupakan ringkasan dari pengetahuan mengikat data saya.

Tips Untuk Mengatasi Masalah DataBinding

Memperbarui

Untuk mendapatkan error dan saran yang lebih akurat , saya sangat menyarankan untuk mengupdate Android Studio dan versi plugin Gradle ke yang terbaru. Karena saya tidak menghadapi banyak masalah setelah versi AS 3.2.

Lihat Android Studio Terbaru , dan Plugin Gradle Terbaru .

Solusi Orignal

Setelah membaca jawaban ini, Anda tidak akan terjebak dalam masalah pembuatan otomatis data binding untuk Kelas dan Variabel Data .

Periksa poin-poin ini satu per satu. Semua ini dapat menyelesaikan pekerjaan Anda. Poin 3 sampai terakhir sangat penting, jadi jangan sampai ketinggalan.

1. Periksa apakah pengikatan data diaktifkan

Anda harus mengaktifkan pengikatan data di build.gradle. Jika tidak, tambahkan ini dan Sinkronkan .

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

2. Periksa tata letak diubah dalam tata letak penjilidan

Sekarang jika Anda ingin kelas data binding dibuat maka Anda harus membungkusnya xml layoutdengan data binding ( <layouttag). Sesuatu seperti ini.

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

Bersamaan dengan ini periksa apakah nama variabel yang mengikat sudah benar seperti pada kelas model tampilan

3. Nama kelas Binding yang dibuat secara otomatis?

Kelas data binding Anda harus dibuat setelah membuat tata letak binding.

Jika nama tata letak Anda dalam kasus ular activity_main.xml maka kelas pengikatan data akan dibuat dalam kasus unta seperti ActivityMainBinding.

4. Tidak Dapat Melihat Saran Impor?

Terkadang saat Anda mengetik ActivityMai..., tidak muncul saran , dalam hal ini impor secara manual .

import <yourpackage>databinding.ActivityMainBinding;

5. Baca Build Fail Logcat

Kelas binding dan variabel baru Anda dalam tata letak tidak akan dibuat jika build Anda gagal. Jadi pertama-tama Buat proyek dengan Ctrl + F9 (Build> Make project) .

  • Jika build gagal maka lihat apa itu error, biasanya kita mengalami error di bidang layout. Log kesalahan akan menunjukkan nomor baris kesalahan dengan masalah tersebut.
  • Pengikatan mungkin gagal menyebabkan beberapa kesalahan bodoh , seperti kesalahan sintaks atau impor yang hilang. Dalam hal ini, Anda akan mendapatkan logcat yang penuh dengan error kelas pengikatan. Tetapi Anda harus membaca logcat lengkap untuk menemukan masalah yang sesuai .

6. Tutup dan buka proyek dari yang terbaru

Saya selalu melakukan ini karena memakan waktu lebih sedikit daripada Rebuild/ Makeproject.

  • Tutup proyek dari File> Tutup Proyek
  • Buka lagi dari yang terbaru

Perhatikan bahwa saya lebih suka Tutup dan Buka dari Terbaru karena membutuhkan waktu lebih sedikit daripada Rebuild / Restart IDE .

7. Membangun Kembali Proyek

Jika masih kelas Anda tidak dibuat. (Beberapa saat ketika kami menempelkan file tata letak, maka itu terjadi). Kemudian Bangun Ulang Proyek dari Build> Rebuild( Bukan Bangun atau Buat proyek ). Ini akan menghasilkan kelas data binding Anda. ( Membangun kembali melakukan Sihir untukku. )

8. Memiliki Android Studio terbaru

Setelah memperbarui AS ke Android Studio 3.2 , saya merasakan banyak perbaikan bug dalam pembuatan otomatis data binding. Jadi, Anda juga harus memiliki AS terbaru.

Solusi untuk <variables

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

Biasanya, ketika kita meletakkan variabel dalam layout, itu membuat pengambil dan penyetelnya. Dan kami dapat menggunakan binding.setItem(item);dan binding.getItem();, tetapi jika Anda tidak dapat melihat metode tersebut, baca informasi di bawah ini.

1. Tutup dan buka proyek dari yang terbaru

Jika Anda telah membuat variabel data - <variabledalam tata letak Anda dan tidak muncul penyetel dan pengambil di kelas data binding, maka Tutup dan Buka dari Terbaru proyek Anda.

2. Proyek bersih setelah mengubah jenis

Jika Anda mengubah jenis beberapa <variabledalam tata letak Anda dan jenis penyetel pengambil tidak berubah maka Bersihkan proyek ( Build> Clean Project)

Kata-kata terakhir

Terakhir, jika kelas pengikatan Anda masih belum dibuat, maka kami memiliki senjata paling ampuh. - Mulai ulang Android Studio: D

  • Pertama, coba mulai ulang , ini selalu menghasilkan variabel tata letak pengikatan saya setelah restart.
  • Jika tidak berhasil maka Invalidate Cache & Restart .

Ini semua yang saya lakukan untuk menyelesaikan kesalahan pengikatan data saya. Jika Anda mendapatkan masalah lebih lanjut, Anda dapat berkomentar di sini.

Khemraj
sumber
2
Jika masalah berlanjut ... (8) Invalidate & restart .... jika tidak terselesaikan, (9) ubah dataBinding {enabled = false} ... build, lalu dataBinding {enabled = true} build lagi ....
PravyNandas
1
Dalam kasus saya, saya harus mengimpor classpath secara manual karena beberapa alasan IDE tidak menunjukkan ini sebagai solusi. Tnx :)
Ivan Kaloyanov
2
Menyelamatkan hariku. Saya kehilangan pembungkus <layout> di file layout saya. Terima kasih!
Juliano
Anda juga dapat menambahkan bahwa "import android.R" harus dihapus, jika itu bagian dari daftar impor. Ini memecahkan masalah saya dengan referensi yang belum terselesaikan ke file xml aktivitas
Tim John
23

Kelas DataBinding dibuat secara otomatis.

jika nama xml Anda adalah activity_test maka kelas Binding akan menjadi ActivityTestBinding.

tapi,

dataBinding {
        enabled = true
    }

layout harus memiliki layout sebagai root

<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>
ViramP
sumber
Saya mencari jiwa berjam-jam, banyak membuat sihir gradle, tapi saya gunakan ConstraintLayoutsebagai root. Terima kasih!
Alexey Markov
14

Saya memiliki masalah yang sama. Setelah membaca dokumen sdk android, hanya ada nama file yang diharapkan untuk dibuat tetapi tidak ada tentang apa yang harus dilakukan jika hal itu tidak terjadi. Saya perhatikan setelah beberapa penelitian lebih lanjut bahwa setelah menghapus namespace ke elemen tata letak seperti di bawah ini (menggunakan contoh Anda), itu berhasil untuk saya.

    <?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> 
ngaspama
sumber
10

Dalam kasus saya, kelas Binding dibuat dan di tempat (tapi saya pikir bukan) ... tetapi tidak secara otomatis menambahkan impor kelas tersebut ke bagian impor aktivitas / fragmen ... jadi ... OPTION + MASUK :)

Krzysztof Kubicki
sumber
2
Bingo, berhasil untuk saya, meskipun saya harus mengetikkan impor secara manual, intellisense tidak menawarkan opsi untuk alasan apa pun.
Rob
8

Setelah mengaturnya dengan benar (termasuk namespace xml dan membungkus semuanya <layout>), yang bekerja untuk saya adalah melakukan Build -> Make project. Juga Proyek Bersih atau Proyek Rebuild tidak. Saya menggunakan Android Studio 2.3.1, menggunakan alat pembuatan 26.0.2. Tidak perlu <data>tag.

Xtreme Biker
sumber
Ini harus ditandai sebagai jawaban yang benar. Istirahat semua hanyalah solusi. Tidak perlu memindahkan namespace atau bahkan menambahkan elemen data
Vicky Kapadia
8

jika Anda melakukan pekerjaan dasar, untuk mengaktifkan databainding dalam proyek Anda, seperti use enable di gradle dan menggunakan tag layout di xml , saat Anda mengubah kode xml dan tidak membuat class penyatuan data baru untuk xml tersebut, Anda dapat menggunakan cara cepat untuk menghasilkan data saja mengikat kelas di gradle-> other-> databindinggenbaseclassesDebug lebih cepat dari bulid seluruh proyek. itu hanya menghasilkan kelas penyatuan data. masukkan deskripsi gambar di sini

Mahdi Azadbar
sumber
4
dataBinding {
        enabled = true
    }

Untuk mengaktifkan compiler data binding baru, tambahkan opsi berikut ke file gradle.properties Anda:

android.databinding.enableV2=true
Samir Mangroliya
sumber
3

Kelas data binding dibuat selama build jadi setelah Anda mengaktifkan data binding dalam build Gradle aplikasi dan mengelilingi xml Anda dengan tag tata letak, Anda harus membuat ulang aplikasi Anda. Jika itu tidak membantu, hapus folder build Anda dan lakukan lagi.

Schadenfreude
sumber
2

Berkat jawaban ini di sini - sepertinya "ruang nama tata letak" perlu dikosongkan, atau Anda memerlukan nama unik baru.

Berikut adalah opsi yang berhasil untuk saya:

  1. Buat nama baru untuk tata letak guna memastikannya dapat dibuat. Ini memecahkan masalah saya, di mana saya memiliki tata letak yang pertama kali dibuat, tanpa data binding - sebut saja fragment_abc.xml. Ketika saya mencoba menambahkan data yang mengikat padanya, itu tidak dikenali - bahkan setelah beberapa cache yang jelas & panggilan ulang. Namun, segera setelah saya membuat salinan layout fragment_abc2.xml, saya segera mendapatkan objek .java / .class data-binding yang dihasilkan.

  2. Setelah melihat pekerjaan di atas, saya mencoba menghapus folder / build dari modul, dan membangun kembali proyek - ini berfungsi untuk mendapatkan data binding untuk tata letak asli.

Gene Bo
sumber
1

Satu-satunya hal yang dapat saya bayangkan jika memungkinkan adalah jika Anda tidak memilikinya

dataBinding {
    enabled true
}

dalam file gradle Anda. Jika tidak, tambahkan saja ke file gradle. yaitu

android {
  ......

  dataBinding {
    enabled true
  }
}

lalu sinkronkan proyek Anda. Jika masih gagal, Anda mungkin perlu melakukan Invalidate / Restart studio android Anda

Hassan Semiu Ayomon
sumber
Saya telah menyebutkan dengan jelas dalam pertanyaan saya bahwa setelah menambahkan <variable>xml itu menghasilkan kelas Binding, jadi tidak ada kasus untuk tidak menambahkan dataBindingfile gradle, jika saya belum menambahkan daripada seharusnya tidak menghasilkan kelas yang mengikat.
Ravi
Sebelum Menyinkronkan dan memulai ulang. Silakan coba untuk 'Membuat'. Ini akan berhasil.
Nizamudeen Sherif
1

Saya tidak tahu ini akan berhasil untuk Anda atau tidak. Ubah saja nama file XML layout. Seperti misalkan nama layout Anda adalah activity_main.xml, ubah saja ganti namanya menjadi main.xml dan ubah namanya menjadi activity_main.xml . Kemudian Anda dapat melihat opsi impor di ActivityMainBinding .

Semoga berhasil untuk Anda.

Sudhansu
sumber
1

Saat Anda bekerja dengan aplikasi Android multimodule periksa jalur kelas binding Anda. Mungkin Anda harus menggunakan:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding insted dari:

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

kosiara - Bartosz Kosarzycki
sumber
1

Hapus tata letak dan urungkan, dan pastikan kelas binding yang dihasilkan diimpor dengan benar setelah itu.

Ahmed AlAskalany
sumber
0

Saya memiliki masalah yang sama. Semua yang Anda lakukan dengan benar. Masalahnya Anda perlu menambahkan variabel di dalam tag data di xml. Untuk itu sebaiknya Anda membuat contoh kelas model dan menambahkannya sebagai variabel pada tag data.

Hingga Anda tidak akan bisa melihat ActivityMainBinding yang dihasilkan.

Srinivasan
sumber
0

Saya memiliki masalah serupa di mana saya memiliki tata letak yang dibungkus dan pengikatan data saya diaktifkan dalam file gradle. Kegiatan utama masih belum bisa melihat atau melihat kelas saya. Apa yang memperbaikinya untuk saya adalah menambahkan variabel pengikat dan tetap mengimpor pengikatan. Dari sana saya baru membangun solusinya dan kemudian sepertinya tahu apa kelasnya. Dari sana saya dapat mengimpor kelas kasus unta saya yang telah dibuat.

stegnerd
sumber
0

Saya mendapat masalah dan masalahnya adalah pada tata letak, bidang yang digunakan bukanlah String, melainkan Tanggal.

Tampaknya semua bidang harus berupa teks agar dapat berfungsi, setidaknya dengan komponen TexView.

Jika Anda membangun dengan perintah ./gradlew build --stacktrace

Ini menunjukkan kesalahan dengan lebih baik.

jactive
sumber
0

Dalam kasus saya, saya pikir kelas yang dihasilkan harus muncul dengan kelas saya yang biasa di srcfolder. Selain itu, saya pikir nama kelas yang dihasilkan harus sedikit berbeda. Itu semua adalah kesalahanku. Kelas yang dihasilkan dapat ditemukan di buildfolder, build -> generated -> ...jalur. Jika tidak ada impor kelas yang dibuat dalam aktivitas Anda, tambahkan impor

import com.yourcompany.app.databinding.ActivityMainBinding;"
Kseniya
sumber
0

Jika Anda mendapatkan error berikut di DataBindingUtil.setContentView

Referensi yang belum terselesaikan: activity_main

semua yang perlu Anda lakukan adalah menghapus pernyataan import berikut

impor android.R

Saya menemukan solusinya di forum lain. Sumber

Tim John
sumber
0

Jika Baru-baru ini ada orang yang memigrasikan proyek yang ada ke androidx maka Anda perlu mengganti impor dari

import com.yourpackagename.BR;

untuk

import androidx.databinding.library.baseAdapters.BR;

Setelah Google 2 hari akhirnya mendapat solusi, mana yang cocok untuk saya.

Milan Sheth
sumber
1
Tidak. Binding Resource ( .BR. ) Seperti Resource ( .R. ). Ini dibuat berdasarkan sumber daya proyek Anda (id, drawable, color, ...) sehingga akan ditempatkan di dalam paket proyek Anda ( your.project.package.BR). Tidak di dalam perpustakaan pihak ketiga seperti androidx.databinding.library.baseAdapters.BR.
dphans
0

Ada beberapa kasus ketika Anda tidak akan melihat file di bawah direktori yang dihasilkan, Anda mungkin mengikat properti yang tidak dideklarasikan di viewmodel. Ini tidak pada dasarnya memberi Anda kesalahan lint jika Anda melakukannya di xml.

Uzair
sumber
0

Jika Anda mengimplementasikan Serializable -> Anda harus mengimplementasikan Serializable

kalau tidak, Anda akan mendapatkan kesalahan ini. Semoga ini akan membantu seseorang di masa depan

Dalam kasus saya, saya menggunakan perpustakaan Parcel. Saya melewatkan untuk membuat anotasi @Parcel di sub kelas saya

Ranjith Kumar
sumber
0

Selain langkah-langkah di atas, Anda juga dapat memeriksa jenis variabel. Pastikan itu String untuk TextView atau sama seperti yang ditentukan di BindingAdapter. Sebagai contoh:

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

dan dalam XML:

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

Ini akan menyebabkan kesalahan di atas. Untuk memperbaikinya Anda dapat membuat variabel usia dari tipe String atau Anda dapat mengimpor String di XML Anda dan menggunakan String.valueOf(age)sebagai berikut:

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

Dan di TextView Anda:

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

Solusi saya adalah mengambil FragmentBinding sebagai sufiks dalam nama kelas.

Kelas pengikatan dibuat untuk setiap file tata letak. Secara default, nama kelas didasarkan pada nama file layout, mengubahnya menjadi huruf Pascal dan menambahkan sufiks Binding ke dalamnya. Nama file layout di atas adalah activity_main.xml sehingga kelas yang dihasilkan adalah ActivityMainBinding. Kelas ini menampung semua binding dari properti tata letak (misalnya, variabel pengguna) ke tampilan tata letak dan tahu cara menetapkan nilai untuk ekspresi binding.

Nomenklatur nama kelas aktivitas atau fragmen dapat bervariasi dalam hal prefiks. Karena sufiksnya selalu Binding.

Setelah mengikuti respons Khemraj dan Invalidate Caches / Restart , Anda harus menulis ulang ActivityBinding atau FragmentBinding untuk mendapatkan saran IDE kelas yang sudah dibuat dan JANGAN melakukan hardcode impor.

Dalam kasus saya, saya mencoba mengimpor nama kelas mundur, FragmentCompetitionsBindingbukan CompetitionsFragmentBinding.

GL

Sumber

Braian Coronel
sumber
0

Dalam kasus saya, kelas pengikatan data tidak dibuat karena saya telah menghapus Direktori Sumber Daya Android mipmap. Saya membuat ulang direktori res / mipmap / dan kelas data binding dipulihkan.

buggily
sumber
0

Saya mengalami masalah serupa di mana DataBinding gagal menghasilkan kelas BindingImpl . Dalam kasus saya adalah masalah dari metode di kelas data di mana nama yang digunakan salah: Model berisi metode onSignInCliked () dan dalam tata letak yang saya gunakan onSigninCliked () . Perhatikan SignIn vs Signin .

Pesan kesalahan tidak cukup dan saya menemukan masalahnya hanya ketika saya menggunakan skrip build dengan opsi stack-trace.

Ionut Negru
sumber
0

Pastikan data binding diaktifkan

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

Sinkronkan proyek dengan gradle dan klik tombol (Sync project with Gradle)

fahrizal89
sumber
0

Jika ada masalah dengan file XML Anda, class Databinding tidak akan dibuat. Perbaikan cepat adalah menjalankan melalui file XML dan memeriksa kesalahan sintaks (yang biasanya disorot dengan warna merah). Kesalahan mungkin datang dalam bentuk referensi yang tidak ada atau salah, kesalahan ketik, dll.

Intinya, pastikan saja tidak ada garis bergaris bawah merah di kode XML Anda. Setelah selesai, buat ulang dan kelas Penyatuan Data Anda akan dibuat.

Taslim Oseni
sumber
-1

1. Tambahkan Di Bawah di app gradle

 dataBinding {
        enabled = true
    }

2. Dalam tata letak xml tulis kode di bawah ini

<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.
Rohan Lodhi
sumber
3
Mengapa dataBinding memerlukan izin internet, dalam kasus umum?
M. Pomeroy
1
@ M.Pomeroy ya tidak wajib, tidak diedit jawabannya terima kasih
Rohan Lodhi
-5

gunakan jalur kelas 'com.android.databinding: dataBinder: 1.0-rc0'

Sumanta Banerjee
sumber
untuk gradle 1.5.0 dan yang lebih baru, tidak perlu menggunakan classpath ini.
Ravi