Lớp liên kết dữ liệu không được tạo


96

Tôi đang sử dụng Data Binding trong dự án của mình, khi sử dụng <layout><data> trong lớp liên kết xml của tôi không được tạo.

Ví dụ: tôi có 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>

Bây giờ nếu tôi đang viết ActivityMainBindingtrong hoạt động / phân đoạn của mình, nó sẽ hiển thị lỗi rằng lớp không khả dụng. Nhưng sau khi đưa <variable>vào tệp xml của tôi, nó có thể tạo ActivityMainBindinglớp.

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


2
dataBinding.enabledtrong build.gradle của bạn không?
pskink 14/09/16

2
Tôi nghĩ rằng đây là một lỗi đã biết. Bạn có thể cố gắng xây dựng dự án của mình trước khi cố truy cập ActivityMainBindinghoặc nó phải làm gì đó với lỗi này .
yennsarah

@pskink có nó là, đó là lý do tại sao nó được tạo ra lớp ràng buộc sau khi thêm <variable>trong xml
Ravi

@Amylinn sau khi xây dựng dự án của tôi, nó tạo ra, nhưng câu hỏi của tôi là khi tôi viết <variable>, nó tạo ra lớp ràng buộc mà không cần xây dựng dự án.
Ravi

ah, thực sự, tôi bị mất rằng
pskink

Câu trả lời:


214

Tôi đã không nhận được bất kỳ câu trả lời hài lòng. Vì vậy, đây là những mẹo là tóm tắt kiến ​​thức liên kết dữ liệu của tôi.

Mẹo để giải quyết vấn đề liên kết dữ liệu

Cập nhật

Để nhận được các lỗiđề xuất chính xác hơn , tôi thực sự khuyên bạn nên cập nhật phiên bản plugin Android Studio và Gradle lên phiên bản mới nhất. Bởi vì tôi không phải đối mặt với nhiều vấn đề sau phiên bản AS 3.2.

Xem Android Studio mới nhấtPlugin Gradle mới nhất .

Giải pháp Orignal

Sau khi đọc câu trả lời này, bạn sẽ không gặp khó khăn trong các vấn đề tự động tạo liên kết dữ liệu cho cả Lớp và Biến dữ liệu .

Kiểm tra từng điểm một. Bất kỳ điều nào trong số này có thể làm cho công việc của bạn được hoàn thành. Điểm 3 đến cuối cùng thực sự quan trọng, vì vậy đừng bỏ lỡ chúng.

1. Kiểm tra xem ràng buộc dữ liệu đã được bật chưa

Bạn nên có dữ liệu ràng buộc kích hoạt trong build.gradle. Nếu không, hãy thêm cái này và Đồng bộ hóa .

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

2. Bố cục kiểm tra được chuyển đổi trong bố cục ràng buộc

Bây giờ nếu bạn muốn lớp liên kết dữ liệu được tạo thì bạn nên bọc xml layoutbằng liên kết dữ liệu ( <layoutthẻ). Một cái gì đó như thế này.

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

Cùng với việc này, hãy kiểm tra xem tên biến liên kết có đúng như trong lớp mô hình chế độ xem hay không

3. Tên lớp Binding được tạo tự động?

Lớp liên kết dữ liệu của bạn sẽ được tạo sau khi tạo bố cục liên kết.

Nếu tên bố trí của bạn ở trong trường hợp con rắn activity_main.xml thì lớp liên kết dữ liệu sẽ được tạo trong trường hợp lạc đà như ActivityMainBinding.

4. Không thể Xem Đề xuất Nhập?

Đôi khi khi bạn nhập ActivityMai..., sau đó nó không hiển thị gợi ý , trong trường hợp đó, hãy nhập thủ công .

import <yourpackage>databinding.ActivityMainBinding;

5. Đọc bản ghi lỗi xây dựng bản ghi

Lớp ràng buộc của bạn và các biến mới trong bố cục sẽ không được tạo nếu bản dựng của bạn không thành công. Vì vậy, đầu tiên Tạo dự án bằng Ctrl + F9 (Xây dựng> Tạo dự án) .

  • Nếu một bản dựng không thành công thì hãy xem lỗi là gì, thông thường chúng ta có lỗi trong các trường bố cục. Nhật ký lỗi sẽ chỉ ra số dòng lỗi với sự cố.
  • Việc liên kết có thể không thành công gây ra một số lỗi ngu ngốc , như lỗi cú pháp hoặc nhập thiếu. Trong trường hợp đó, bạn sẽ nhận được logcat đầy lỗi của các lớp ràng buộc. Nhưng bạn nên đọc logcat hoàn chỉnh để tìm vấn đề thích hợp .

6. Đóng và mở dự án từ gần đây

Tôi luôn làm điều này vì nó tốn ít thời gian hơn nhiều so với Rebuild/ Makedự án.

  • Đóng dự án từ Tệp> Đóng dự án
  • Mở lại từ gần đây

Lưu ý rằng tôi thích Đóng và Mở từ Gần đây vì nó mất ít thời gian hơn nhiều so với Xây dựng lại / Khởi động lại IDE .

7. Xây dựng lại dự án

Nếu lớp của bạn vẫn chưa được tạo. (Một số thời điểm khi chúng tôi dán tệp bố cục, sau đó nó xảy ra). Sau đó xây dựng lại dự án từ Build> Rebuild( Không xây dựng hoặc thực hiện dự án ). Nó sẽ tạo ra lớp ràng buộc dữ liệu của bạn. ( Xây dựng lại ma thuật cho tôi. )

8. Có Android Studio mới nhất

Sau khi cập nhật AS lên Android Studio 3.2 , tôi cảm thấy nhiều lỗi được sửa trong quá trình tạo tự động liên kết dữ liệu. Vì vậy, bạn cũng nên có AS mới nhất.

Giải pháp cho <variables

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

Thông thường, khi chúng ta đặt một biến trong bố cục, nó sẽ tạo ra một bộ định vị và bộ định vị của nó. Và chúng ta có thể sử dụng binding.setItem(item);binding.getItem();, nhưng nếu bạn không thể thấy những phương pháp đó thì hãy đọc thông tin bên dưới.

1. Đóng và mở dự án từ gần đây

Nếu bạn đã tạo một biến dữ liệu - <variabletrong bố cục của bạn và nó không hiển thị bộ cài và bộ nhận trong lớp liên kết dữ liệu, thì hãy Đóng và Mở từ Gần đây dự án của bạn.

2. Làm sạch dự án sau khi thay đổi loại

Nếu bạn đã thay đổi kiểu của một số <variabletrong bố cục của mình và kiểu setter getter không thay đổi thì Clean project ( Build> Clean Project)

Từ cuối cùng

Cuối cùng, nếu lớp ràng buộc của bạn vẫn chưa được tạo ra, thì chúng ta có vũ khí mạnh nhất của mình. - Khởi động lại Android Studio: D

  • Đầu tiên, hãy thử khởi động lại , điều này luôn tạo ra các biến của bố cục ràng buộc của tôi sau khi khởi động lại.
  • Nếu nó không hoạt động thì Vô hiệu hóa bộ nhớ cache & Khởi động lại .

Đây là tất cả những gì tôi làm để giải quyết các lỗi liên kết dữ liệu của mình. Nếu gặp vấn đề gì khác, bạn có thể bình luận tại đây.


2
Nếu sự cố vẫn tiếp diễn ... (8) Vô hiệu hóa & khởi động lại .... nếu không được giải quyết, (9) thay đổi dataBinding {enable = false} ... build, sau đó dataBinding {enable = true} tạo lại ....
PravyNandas


1
Trong trường hợp của tôi, tôi đã phải nhập classpath theo cách thủ công vì một số lý do IDE không hiển thị điều này như một giải pháp. Tnx :)
Ivan Kaloyanov 23/09/18

2
Đã lưu ngày của tôi. Tôi đã thiếu gói <layout> trong tệp bố cục của mình. Cảm ơn bạn!
Juliano

Bạn cũng có thể thêm rằng "nhập android.R" phải được xóa, nếu nó là một phần của danh sách nhập. Điều này giải quyết vấn đề của tôi với tài liệu tham khảo cần được xem đến tập tin hoạt động xml
Tim John

23

Lớp DataBinding được tạo tự động.

nếu tên xml của bạn là activity_test thì lớp Binding sẽ là ActivityTestBinding.

nhưng,

dataBinding {
        enabled = true
    }

bố cục nên có bố cục làm gốc

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

Tôi đang tìm kiếm soultion trong nhiều giờ, làm cho gradle magic rất nhiều, nhưng tôi sử dụng nó ConstraintLayoutnhư một gốc. Cảm ơn bạn!
Alexey Markov,

14

Tôi gặp vấn đề tương tự. Sau khi đọc qua tài liệu sdk android, chỉ có tên tệp dự kiến ​​sẽ được tạo nhưng không biết phải làm gì nếu nó không xảy ra. Tôi nhận thấy sau một số nghiên cứu thêm rằng sau khi loại bỏ không gian tên cho phần tử bố cục như bên dưới (sử dụng ví dụ của bạn), nó đã hoạt động với tôi.

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

Trong trường hợp của tôi, lớp Liên kết đã được tạo và tại chỗ (nhưng tôi nghĩ là không) ... nhưng nó không tự động thêm nhập của lớp đã nói vào phần nhập hoạt động / phân đoạn ... vì vậy ... TÙY CHỌN + ĐI VÀO :)


2
Bingo, đã làm việc cho tôi, mặc dù tôi phải gõ nhập theo cách thủ công, intellisense không cung cấp tùy chọn vì bất kỳ lý do gì.
Rob

8

Sau khi đã thiết lập nó đúng cách (bao gồm không gian tên xml và gói mọi thứ vào <layout>), cái phù hợp với tôi là Build -> Make project. Dự án sạch hoặc dự án xây dựng lại cũng không. Tôi đang sử dụng Android Studio 2.3.1, sử dụng các công cụ xây dựng 26.0.2. Không cần <data>thẻ.


Đây phải được đánh dấu là câu trả lời đúng. Còn lại tất cả chỉ là cách giải quyết. Không cần phải di chuyển không gian tên hoặc thậm chí thêm phần tử dữ liệu
Vicky Kapadia

8

nếu bạn thực hiện công việc cơ bản, để kích hoạt ghi dữ liệu trong dự án của bạn, như sử dụng enable trong gradle và sử dụng thẻ bố cục trong xml , khi bạn thay đổi mã xml và không tạo lớp kết hợp dữ liệu mới cho những xml đó, bạn có thể sử dụng một cách nhanh chóng để chỉ tạo dữ liệu ràng buộc lớp trong gradle-> other-> databindinggenbaseclasses Gỡ lỗi nhanh hơn toàn bộ dự án. nó tạo ra lớp dữ liệu duy nhất. nhập mô tả hình ảnh ở đây


4
dataBinding {
        enabled = true
    }

Để bật trình biên dịch liên kết dữ liệu mới, hãy thêm tùy chọn sau vào tệp gradle.properties của bạn:

android.databinding.enableV2=true

3

Các lớp liên kết dữ liệu được tạo trong quá trình xây dựng, vì vậy sau khi bạn bật liên kết dữ liệu trong bản dựng Gradle của ứng dụng và bao quanh xml của bạn bằng thẻ bố cục, bạn nên xây dựng lại ứng dụng của mình. Nếu điều đó không hữu ích, hãy xóa thư mục xây dựng của bạn và thực hiện lại.


2

Nhờ câu trả lời này ở đây - có vẻ như "không gian tên bố cục" cần được xóa hoặc bạn cần một tên duy nhất mới.

Dưới đây là các tùy chọn phù hợp với tôi:

  1. Tạo một tên mới cho bố cục để đảm bảo rằng nó có thể được tạo. Điều này đã giải quyết được vấn đề của tôi, trong đó tôi có một bố cục được tạo lần đầu tiên, không có ràng buộc dữ liệu - hãy gọi nó như vậy fragment_abc.xml. Khi tôi cố gắng thêm liên kết dữ liệu vào nó, nó không được nhận dạng - ngay cả sau nhiều lần xóa bộ nhớ cache và cuộc gọi khởi động lại. Tuy nhiên, ngay sau khi tôi tạo một bản sao của bố cục fragment_abc2.xml, ngay lập tức tôi nhận được đối tượng .java / .class ràng buộc dữ liệu được tạo.

  2. Sau khi thấy công việc ở trên, tôi đã cố gắng xóa thư mục / build khỏi mô-đun và xây dựng lại dự án - điều này hoạt động để có được ràng buộc dữ liệu cho bố cục ban đầu.


1

Điều duy nhất tôi có thể tưởng tượng nếu có thể là nếu bạn không có

dataBinding {
    enabled true
}

trong tệp gradle của bạn. Nếu không, chỉ cần thêm nó vào tệp gradle. I E

android {
  ......

  dataBinding {
    enabled true
  }
}

sau đó đồng bộ hóa dự án của bạn. Nếu nó vẫn không thành công, bạn có thể cần thực hiện Vô hiệu hóa / Khởi động lại studio android của mình


Tôi đã đề cập rõ ràng trong câu hỏi của mình rằng sau khi thêm <variable>vào xml, nó sẽ tạo ra lớp Liên kết, vì vậy không có trường hợp nào không thêm dataBindingtrong tệp gradle, nếu tôi chưa thêm nó sẽ không tạo ra lớp liên kết.
Ravi

Trước khi Đồng bộ hóa và khởi động lại. Hãy cố gắng 'Make'. Nó sẽ làm việc bên ngoài.
Nizamudeen Sherif

1

Tôi không biết nó sẽ làm việc cho bạn hay không. Chỉ cần đổi tên tên tệp XML bố cục. Giống như giả sử tên bố cục của bạn là activity_main.xml, chỉ cần thay đổi tên nó thành bất kỳ thứ gì như main.xml và một lần nữa đổi tên nó thành activity_main.xml . Sau đó, bạn có thể thấy tùy chọn nhập trên ActivityMainBinding .

Hi vọng nó sẽ giúp ích cho bạn.


1

Khi bạn làm việc với một ứng dụng Android đa mô-đun hãy kiểm tra đường dẫn lớp ràng buộc của bạn. Có thể bạn nên sử dụng:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding Thay vì:

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


1

Xóa bố cục và hoàn tác, đồng thời đảm bảo rằng các lớp liên kết đã tạo được nhập chính xác sau đó.


0

Tôi đã có cùng một vấn đề. Mọi thứ bạn làm đều đúng. Vấn đề là bạn cần thêm biến bên trong thẻ dữ liệu trong xml. Để làm được điều đó, bạn nên tạo một lớp mô hình mẫu và thêm nó dưới dạng biến trong thẻ dữ liệu.

Cho đến khi bạn sẽ không thấy ActivityMainBinding đã tạo.


0

Tôi đã gặp sự cố tương tự trong đó tôi đã gói bố cục và kích hoạt liên kết dữ liệu của tôi trong tệp gradle. Hoạt động chính vẫn không thể intellisense hoặc xem các lớp học của tôi. Điều đã sửa nó cho tôi là thêm biến ràng buộc và vẫn nhập ràng buộc. Từ đó tôi mới xây dựng giải pháp và sau đó nó dường như biết lớp học là gì. Từ đó, tôi có thể nhập các lớp vỏ lạc đà của mình đã được tạo.


0

Tôi gặp sự cố và vấn đề nằm ở bố cục mà trường được sử dụng không phải là Chuỗi, mà là Ngày.

Có vẻ như tất cả các trường phải là văn bản để hoạt động, ít nhất là với thành phần TexView.

Nếu bạn xây dựng bằng lệnh ./gradlew build --stacktrace

Điều này hiển thị tốt hơn các lỗi.


0

Trong trường hợp của tôi, tôi nghĩ rằng lớp được tạo phải xuất hiện cùng với các lớp thông thường của tôi trong srcthư mục. Ngoài ra, tôi nghĩ rằng tên của lớp đã tạo nên hơi khác một chút. Tất cả là sai lầm của tôi. Lớp được tạo có thể được tìm thấy trong buildthư mục, build -> generated -> ...đường dẫn. Nếu không có lần nhập nào của lớp đã tạo trong hoạt động của bạn, hãy thêm nhập

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

0

Trong trường hợp bạn gặp lỗi sau trong DataBindingUtil.setContentView

Tham chiếu chưa được giải quyết: activity_main

tất cả những gì bạn cần làm là xóa câu lệnh nhập sau

nhập android.R

Tôi đã tìm thấy giải pháp trên một diễn đàn khác. Nguồn


0

Nếu Gần đây, bất kỳ ai đã di chuyển dự án hiện có vào androidx thì bạn cần thay thế quá trình nhập của mình từ

import com.yourpackagename.BR;

đến

import androidx.databinding.library.baseAdapters.BR;

Sau 2 ngày Google cuối cùng cũng có giải pháp, giải pháp nào phù hợp với tôi.


1
Không. Tài nguyên ràng buộc ( .BR. ) Như Tài nguyên ( .R. ). Nó được tạo dựa trên tài nguyên dự án của bạn (id, drawable, color, ...) nên nó sẽ đặt bên trong gói dự án của bạn ( your.project.package.BR). Không bên trong thư viện của bên thứ ba như thế nào androidx.databinding.library.baseAdapters.BR.
dphans

0

Có những trường hợp bạn sẽ không thấy tệp trong thư mục đã tạo, bạn có thể đang ràng buộc một thuộc tính không được khai báo trong mô hình xem. Về cơ bản, nó không cung cấp cho bạn lỗi lint nếu bạn làm như vậy trong xml.


0

Nếu bạn đang triển khai Serializable -> bạn phải triển khai Serializable

nếu không bạn sẽ gặp lỗi này. Hy vọng nó sẽ giúp ai đó trong tương lai

Trong trường hợp của tôi, tôi sử dụng thư viện Bưu kiện. Tôi đã bỏ lỡ chú thích @Parcel trong lớp phụ của mình


0

Ngoài các bước trên, bạn cũng có thể kiểm tra kiểu biến. Đảm bảo rằng đó là Chuỗi cho TextView hoặc giống như được định nghĩa trong BindingAdapter. Ví dụ:

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

và trong XML:

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

Điều này sẽ gây ra lỗi trên. Để khắc phục, bạn có thể tạo biến tuổi của kiểu Chuỗi hoặc bạn có thể nhập Chuỗi trong XML của mình và sử dụng String.valueOf(age)như sau:

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

Và trong TextView của bạn:

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

0

Giải pháp của tôi là lấy hậu tố FragmentBinding trong tên lớp.

Một lớp ràng buộc được tạo cho mỗi tệp bố cục. Theo mặc định, tên của lớp dựa trên tên của tệp bố cục, chuyển đổi nó thành kiểu chữ Pascal và thêm hậu tố Binding vào nó. Tên tệp bố cục ở trên là activity_main.xml nên lớp được tạo tương ứng là ActivityMainBinding. Lớp này giữ tất cả các ràng buộc từ các thuộc tính bố cục (ví dụ, biến người dùng) đến các khung nhìn của bố cục và biết cách gán giá trị cho các biểu thức ràng buộc.

Danh pháp của tên của lớp hoạt động hoặc phân đoạn có thể khác nhau về tiền tố. Vì hậu tố luôn luôn Ràng buộc.

Sau khi làm theo phản hồi của Khemraj và không hợp lệ hóa Cache / Khởi động lại , bạn nên viết lại ActivityBinding hoặc FragmentBinding để nhận các đề xuất IDE của các lớp đã được tạo và KHÔNG tạo cứng bản nhập.

Trong trường hợp của tôi, tôi đã cố gắng nhập ngược tên của lớp FragmentCompetitionsBindingthay vìCompetitionsFragmentBinding .

GL

Nguồn


0

Trong trường hợp của tôi, các lớp liên kết dữ liệu không được tạo vì tôi đã xóa Thư mục tài nguyên Android mipmap. Tôi đã tạo lại thư mục res / mipmap / và các lớp liên kết dữ liệu đã được khôi phục.


0

Tôi đã gặp sự cố tương tự trong đó DataBinding không tạo được lớp BindingImpl . Trong trường hợp của tôi là sự cố từ một phương thức trong lớp dữ liệu mà tên đã được sử dụng sai: Mô hình chứa một phương thức onSignInCliked () và trong bố cục tôi đã sử dụng onSigninCliked () . Chú ý signin vs | Đăng nhập .

Thông báo lỗi không đủ và tôi chỉ phát hiện ra sự cố khi tôi sử dụng tập lệnh xây dựng với tùy chọn theo dõi ngăn xếp.


0

Đảm bảo rằng liên kết dữ liệu được bật

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

Đồng bộ hóa dự án với gradle dan nhấp vào nút (Đồng bộ dự án với Gradle)


0

Nếu có vấn đề với tệp XML của bạn, lớp Databinding sẽ không được tạo. Cách khắc phục nhanh chóng là chạy qua tệp XML và kiểm tra các lỗi cú pháp (thường được đánh dấu màu đỏ). Các lỗi có thể xảy ra dưới dạng các tham chiếu không tồn tại hoặc sai, lỗi đánh máy, v.v.

Về bản chất, chỉ cần đảm bảo không có dòng gạch dưới màu đỏ trong mã XML của bạn. Khi bạn hoàn tất, hãy xây dựng lại và lớp Databinding của bạn sẽ được tạo.


-1

1.Thêm vào bên dưới trong gradle ứng dụng

 dataBinding {
        enabled = true
    }

2. trong bố cục xml viết mã bên dưới

<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
Trong trường hợp chung, tại sao dataBinding lại yêu cầu sự cho phép của Internet?
M.Pomeroy

1
@ M.Pomeroy có nó là không cần thiết, không thay đổi nội dung câu trả lời nhờ
Rohan Lodhi

-5

sử dụng đường dẫn lớp 'com.android.databinding: dataBinder: 1.0-rc0'


đối với gradle 1.5.0 trở lên, không cần sử dụng classpath này.
Ravi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.