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 ActivityMainBinding
kelas.
Android Studio: 2.1.3
Jalur Kelas
: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0
dataBinding.enabled
di build.gradle Anda?ActivityMainBinding
, atau proyek tersebut harus melakukan sesuatu dengan bug ini .<variable>
dalam xml<variable>
, itu menghasilkan kelas yang mengikat tanpa membangun proyek.Jawaban:
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
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 .2. Periksa tata letak diubah dalam tata letak penjilidan
Sekarang jika Anda ingin kelas data binding dibuat maka Anda harus membungkusnya
xml layout
dengan data binding (<layout
tag). Sesuatu seperti ini.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.
4. Tidak Dapat Melihat Saran Impor?
Terkadang saat Anda mengetik
ActivityMai...
, tidak muncul saran , dalam hal ini impor secara manual .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) .
6. Tutup dan buka proyek dari yang terbaru
Saya selalu melakukan ini karena memakan waktu lebih sedikit daripada
Rebuild
/Make
project.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
Biasanya, ketika kita meletakkan variabel dalam layout, itu membuat pengambil dan penyetelnya. Dan kami dapat menggunakan
binding.setItem(item);
danbinding.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 -
<variable
dalam 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
<variable
dalam 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
Ini semua yang saya lakukan untuk menyelesaikan kesalahan pengikatan data saya. Jika Anda mendapatkan masalah lebih lanjut, Anda dapat berkomentar di sini.
sumber
Kelas DataBinding dibuat secara otomatis.
jika nama xml Anda adalah activity_test maka kelas Binding akan menjadi ActivityTestBinding.
tapi,
layout harus memiliki layout sebagai root
sumber
ConstraintLayout
sebagai root. Terima kasih!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.
sumber
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 :)
sumber
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.sumber
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.
sumber
Untuk mengaktifkan compiler data binding baru, tambahkan opsi berikut ke file gradle.properties Anda:
sumber
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.
sumber
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:
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 layoutfragment_abc2.xml
, saya segera mendapatkan objek .java / .class data-binding yang dihasilkan.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.
sumber
Satu-satunya hal yang dapat saya bayangkan jika memungkinkan adalah jika Anda tidak memilikinya
dalam file gradle Anda. Jika tidak, tambahkan saja ke file gradle. yaitu
lalu sinkronkan proyek Anda. Jika masih gagal, Anda mungkin perlu melakukan Invalidate / Restart studio android Anda
sumber
<variable>
xml itu menghasilkan kelas Binding, jadi tidak ada kasus untuk tidak menambahkandataBinding
file gradle, jika saya belum menambahkan daripada seharusnya tidak menghasilkan kelas yang mengikat.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.
sumber
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
sumber
Hapus tata letak dan urungkan, dan pastikan kelas binding yang dihasilkan diimpor dengan benar setelah itu.
sumber
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.
sumber
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.
sumber
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.
sumber
Dalam kasus saya, saya pikir kelas yang dihasilkan harus muncul dengan kelas saya yang biasa di
src
folder. Selain itu, saya pikir nama kelas yang dihasilkan harus sedikit berbeda. Itu semua adalah kesalahanku. Kelas yang dihasilkan dapat ditemukan dibuild
folder,build -> generated -> ...
jalur. Jika tidak ada impor kelas yang dibuat dalam aktivitas Anda, tambahkan imporsumber
Jika Anda mendapatkan error berikut di DataBindingUtil.setContentView
semua yang perlu Anda lakukan adalah menghapus pernyataan import berikut
Saya menemukan solusinya di forum lain. Sumber
sumber
Jika Baru-baru ini ada orang yang memigrasikan proyek yang ada ke androidx maka Anda perlu mengganti impor dari
untuk
Setelah Google 2 hari akhirnya mendapat solusi, mana yang cocok untuk saya.
sumber
your.project.package.BR
). Tidak di dalam perpustakaan pihak ketiga sepertiandroidx.databinding.library.baseAdapters.BR
.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.
sumber
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
sumber
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:dan dalam XML:
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:Dan di TextView Anda:
sumber
Solusi saya adalah mengambil FragmentBinding sebagai sufiks dalam nama kelas.
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,
FragmentCompetitionsBinding
bukanCompetitionsFragmentBinding
.GL
Sumber
sumber
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.
sumber
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.
sumber
Pastikan data binding diaktifkan
dan klik tombol (Sync project with Gradle)
sumber
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.
sumber
1. Tambahkan Di Bawah di app gradle
2. Dalam tata letak xml tulis kode di bawah ini
sumber
gunakan jalur kelas 'com.android.databinding: dataBinder: 1.0-rc0'
sumber