데이터 바인딩 클래스가 생성되지 않았습니다.


96

내 프로젝트에서 데이터 바인딩을 사용 <layout>하고 <data>있는데 xml 바인딩 클래스가 생성되지 않았습니다.

예를 들어 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>

이제 ActivityMainBinding내 활동 / 조각을 작성 하면 클래스를 사용할 수 없다는 오류가 표시됩니다. 하지만 <variable>내 xml 파일에 포함 하면 ActivityMainBinding클래스 를 생성 할 수 있습니다.

Android 스튜디오 : 2.1.3
클래스 경로 : com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0


2
입니다 dataBinding.enabled당신의 build.gradle에?
pskink

2
나는 이것이 알려진 오류라고 생각합니다. 당신은 당신이 액세스를 시도하기 전에 당신의 프로젝트를 빌드 할 수 있습니다 ActivityMainBinding, 또는 뭔가 관련이있다 버그를.
yennsarah

@pskink 예, 그렇기 때문에 <variable>xml에 추가 한 후 바인딩 클래스를 생성하고 있습니다
Ravi

@Amylinn 내 프로젝트를 빌드 한 후 생성하지만 내 질문은 내가 작성할 때 <variable>프로젝트를 빌드하지 않고 바인딩 클래스를 생성한다는 것입니다.
Ravi

아, 참, 내가 그 놓친
pskink

답변:


214

만족스러운 답을 얻지 못했습니다. 여기 내 데이터 바인딩 지식을 요약 한 팁이 있습니다.

데이터 바인딩 문제 해결을위한 팁

최신 정보

더 정확한 오류제안 을 얻으려면 Android Studio 및 Gradle 플러그인 버전을 최신 버전으로 업데이트하는 것이 좋습니다. AS 3.2 버전 이후에는 많은 문제가 발생하지 않았기 때문입니다.

참조 안드로이드 스튜디오 최신최신 Gradle을 플러그인 .

Orignal 솔루션

이 답변을 읽은 후에 는 클래스 및 데이터 변수 모두에 대한 데이터 바인딩 자동 생성 문제 갇히지 않을 것 입니다.

이 점을 하나씩 확인하십시오. 이들 중 어느 것이 든 작업을 완료 할 수 있습니다. 마지막 포인트 3은 정말 중요하므로 놓치지 마세요.

1. 데이터 바인딩이 활성화되었는지 확인

에서 데이터 바인딩을 활성화 해야합니다 build.gradle. 그렇지 않은 경우 이것을 추가하고 Sync .

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

2. 레이아웃이 바인딩 레이아웃으로 변환되었는지 확인합니다.

이제 데이터 바인딩 클래스를 생성하려면 데이터 바인딩 ( 태그)으로 래핑xml layout 해야합니다 <layout. 이 같은.

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

이 검사와 함께 바인딩 변수 이름이 뷰 모델 클래스에서와 같이 올바른지 확인합니다.

3. 자동 생성 된 바인딩 클래스 이름?

데이터 바인딩 클래스는 바인딩 레이아웃을 만든 후에 생성해야합니다.

레이아웃 이름이 스네이크 케이스 인 경우 activity_main.xml 데이터 바인딩 클래스가 와 같은 카멜 케이스 로 생성됩니다 ActivityMainBinding.

4. 가져 오기 제안을 볼 수 없습니까?

입력 할 때 때때로 ActivityMai..., 그것은 제안을 표시하지 않습니다 그 경우에, 수동으로 가져 오기 .

import <yourpackage>databinding.ActivityMainBinding;

5. 빌드 실패 Logcat 읽기

빌드가 실패하면 바인딩 클래스와 레이아웃의 새 변수가 생성되지 않습니다. 그래서 일단 만들기 프로젝트Ctrl + F9 (빌드> 만들기 프로젝트) .

  • 빌드가 실패하면 오류가 무엇인지 확인합니다. 일반적으로 레이아웃 필드에 오류가 있습니다. 오류 로그에 문제가있는 오류 줄 번호가 표시됩니다.
  • 바인딩이 실패 하면 구문 오류 또는 가져 오기 누락과 같은 어리석은 오류가 발생할 있습니다 . 이 경우 바인딩 클래스의 오류로 가득 찬 logcat이 표시됩니다. 그러나 적절한 문제찾으 려면 완전한 logcat읽어야 합니다.

6. 최근에서 프로젝트를 닫고 엽니 다.

Rebuild/ Make프로젝트 보다 시간이 훨씬 적게 걸리기 때문에 항상 이렇게합니다 .

  • 파일> 프로젝트 닫기에서 프로젝트 닫기
  • 최근에서 다시 열기

참고 내가 선호 닫기 열기 에서 최근 이보다 훨씬 적은 시간이 걸리기 때문에 다시 작성 / 다시 시작 IDE를 .

7. 프로젝트 재 구축

여전히 클래스가 생성되지 않으면. (때때로 레이아웃 파일을 붙여 넣으면 발생합니다). 그런 다음 ( Not Build 또는 Make project ) 에서 프로젝트다시 빌드하십시오 . 데이터 바인딩 클래스를 생성합니다. ( Rebuild는 나를 위해 Magic을 사용합니다. )Build> Rebuild

8. 최신 Android Studio 보유

AS를 Android Studio 3.2로 업데이트 한 후 데이터 바인딩 자동 생성에서 많은 버그가 수정되는 것을 느꼈습니다. 따라서 최신 AS도 있어야합니다.

솔루션 <variables

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

일반적으로 레이아웃에 변수를 넣으면 getter와 setter가 생성됩니다. 그리고 우리는 사용 binding.setItem(item);하고 binding.getItem();있지만, 그 방법을 볼 수없는 경우 다음 정보 아래를 참조하십시오.

1. 최근부터 프로젝트 닫기 및 열기

데이터 변수를 생성 한 경우- <variable레이아웃 에서 데이터 바인딩 클래스에 setter 및 getter표시되지 않으면 최근 항목에서 닫기 및 열기 프로젝트 .

2. 유형 변경 후 프로젝트 정리

<variable레이아웃에서 일부 유형을 변경 하고 getter setter 유형이 변경되지 않으면 프로젝트 정리 ( Build> Clean Project)

마지막 단어

마지막으로 여전히 바인딩 클래스가 생성되지 않으면 가장 강력한 무기가 있습니다. - 다시 시작 안드로이드 스튜디오 : D

  • 첫째, 다시 시작하십시오. 다시 시작 하면 항상 바인딩 레이아웃의 변수가 생성됩니다.
  • 작동하지 않으면 캐시무효화하고 다시 시작하십시오 .

이것이 내 데이터 바인딩 오류를 해결하기 위해 내가하는 전부입니다. 추가 문제가 발생하면 여기에 의견을 남길 수 있습니다.


2
문제가 계속되면 ... (8) 무효화 및 다시 시작 .... 해결되지 않으면 (9) dataBinding {enabled = false} ... 빌드를 변경 한 다음 dataBinding {enabled = true} 다시 빌드합니다 ....
PravyNandas


1
필자의 경우 IDE가이를 솔루션으로 표시하지 않는 이유로 클래스 경로를 수동으로 가져와야했습니다. Tnx :)
Ivan Kaloyanov

2
내 하루를 구했습니다. 내 레이아웃 파일에서 <layout> 래핑이 누락되었습니다. 감사합니다!
Juliano

가져 오기 목록의 일부인 경우 "import android.R"을 제거해야한다고 추가 할 수도 있습니다. 이로써이 작업 XML 파일에 해결되지 않은 참조하여 내 문제를 해결
팀 요한에게

23

자동으로 생성되는 DataBinding 클래스.

xml 이름이 activity_test이면 Binding 클래스는 ActivityTestBinding이됩니다.

그러나,

dataBinding {
        enabled = true
    }

레이아웃은 루트로 레이아웃을 가져야합니다.

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

나는 몇 시간 동안 soultion을 찾고 있고, gradle magic을 많이 만들지 만 ConstraintLayout, 루트로 사용 합니다. 감사합니다!
Alexey Markov

14

나는 같은 문제가 있었다. android sdk 문서를 읽은 후 생성 될 예상 파일 이름 만 있지만 발생하지 않을 경우 수행 할 작업에 대한 내용은 없습니다. 좀 더 많은 조사를 한 후에 (귀하의 예를 사용하여) 아래와 같이 레이아웃 요소에 네임 스페이스를 제거한 후 저에게 효과적이라는 것을 알았습니다.

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

제 경우에는 Binding 클래스가 생성되어 제자리에 있습니다 (하지만 그렇지 않다고 생각했습니다) ...하지만 해당 클래스의 가져 오기를 활동 / 조각 가져 오기 섹션에 자동으로 추가하지 않습니다 ... 그래서 ... OPTION + 시작하다 :)


2
Bingo는 나를 위해 일했지만 수동으로 가져 오기를 입력해야했지만 intellisense는 어떤 이유로 든 옵션을 제공하지 않았습니다.
Rob

8

제대로 설정 한 후 (xml 네임 스페이스 포함 및 모든 것을으로 래핑 <layout>) 저에게 도움이 된 것은 Build-> Make project였습니다. Clean Project 또는 Rebuild Project도 마찬가지입니다. 저는 26.0.2 빌드 도구를 사용하는 Android Studio 2.3.1에 있습니다. <data>태그 가 필요 없습니다 .


이것은 정답으로 표시되어야합니다. 나머지는 모두 해결 방법입니다. 네임 스페이스를 이동하거나 데이터 요소를 추가 할 필요가 없습니다
비키 Kapadia을

8

기본 작업을 수행하는 경우 gradle에서 enable을 사용 하고 xml에서 레이아웃 태그를 사용하는 것과 같이 프로젝트 에서 데이터 베인 딩을 활성화 하려면 xml 코드를 변경하고 해당 xml에 대한 새 데이터 바인딩 클래스를 생성하지 않은 경우 생성 전용 데이터에 대해 빠른 방법을 사용할 수 있습니다. gradle-> other-> databindinggenbaseclasses의 바인딩 클래스 전체 프로젝트보다 빠르게 디버깅하십시오 . 데이터 바인딩 클래스 만 생성합니다. 여기에 이미지 설명 입력


4
dataBinding {
        enabled = true
    }

새 데이터 바인딩 컴파일러를 사용하려면 gradle.properties 파일에 다음 옵션을 추가하십시오.

android.databinding.enableV2=true

3

데이터 바인딩 클래스는 빌드 중에 생성되므로 앱의 Gradle 빌드에서 데이터 바인딩을 활성화하고 xml을 레이아웃 태그로 둘러싼 후에 앱을 다시 빌드해야합니다. 그래도 도움이되지 않으면 빌드 폴더를 삭제하고 다시 수행하십시오.


2

이 답변 덕분에 "레이아웃 네임 스페이스" 처럼 보입니다. 밖으로 삭제하거나 새로운 고유 한 이름을 필요로 할 수 중 하나를해야합니다.

나를 위해 일한 옵션은 다음과 같습니다.

  1. 레이아웃을 생성 할 수 있도록 새로운 이름을 만드십시오. 이것은 데이터 바인딩없이 처음 생성 된 레이아웃이있는 내 문제를 해결 했습니다 fragment_abc.xml. 데이터 바인딩을 추가하려고 할 때 캐시 지우기 및 다시 시작 호출을 여러 번 수행 한 후에도 인식되지 않았습니다. 그러나 레이아웃을 복사하자마자 fragment_abc2.xml생성 된 데이터 바인딩 .java / .class 객체를 얻었습니다.

  2. 위의 작업을 본 후 모듈에서 / build 폴더를 제거하고 프로젝트를 다시 빌드하려고했습니다. 이것은 원래 레이아웃에 대한 데이터 바인딩을 가져 오는 데 효과적이었습니다.


1

가능하다면 내가 상상할 수있는 유일한 것은

dataBinding {
    enabled true
}

gradle 파일에. 그렇지 않다면 gradle 파일에 추가하십시오. 즉

android {
  ......

  dataBinding {
    enabled true
  }
}

그런 다음 프로젝트를 동기화하십시오. 그래도 실패하면 Android 스튜디오를 무효화 / 다시 시작해야 할 수 있습니다.


나는 내 질문 <variable>에서 xml에 추가 한 후 Binding 클래스를 생성하므로 바인딩 클래스를 생성하지 않아야하는 dataBinding것보다 추가하지 않은 경우 gradle 파일에 추가하지 않는 경우가 없다고 분명히 언급했습니다 .
Ravi

동기화 및 재시작 전. '만들기'를 시도하세요. 운동 할 것입니다.
Nizamudeen Sherif

1

나는 그것이 당신에게 효과가 있을지 여부를 모릅니다. 레이아웃 XML 파일 이름을 변경 하기 만하면 됩니다. 레이아웃 이름이 activity_main.xml 이라고 가정하는 것처럼 이름을 main.xml 과 같은 이름으로 변경하고 다시 activity_main.xml로 이름을 바꿉니다 . 그런 다음 ActivityMainBinding 에서 가져 오기 옵션을 볼 수 있습니다 .

그것이 당신을 위해 작동하기를 바랍니다.


1

다중 모듈 Android 애플리케이션으로 작업하는 경우 바인딩 클래스 경로를 확인하십시오. 아마도 다음을 사용해야합니다.

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding 대신해서:

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



0

나는 같은 문제가 있었다. 당신이했던 모든 것. 문제는 xml의 데이터 태그 안에 변수를 추가해야한다는 것입니다. 이를 위해 샘플 모델 클래스를 생성하고 데이터 태그에 변수로 추가해야합니다.

그 전까지는 생성 된 ActivityMainBinding을 볼 수 없습니다.


0

레이아웃을 래핑하고 gradle 파일에서 데이터 바인딩을 활성화 한 비슷한 문제가 발생했습니다. 주요 활동은 여전히 ​​내 수업을 이해하거나 볼 수 없었습니다. 나를 위해 수정 한 것은 바인딩 변수를 추가하고 어쨌든 바인딩을 가져 오는 것입니다. 거기에서 나는 방금 솔루션을 구축했고 클래스가 무엇인지 아는 것 같았습니다. 거기에서 생성 된 낙타 케이스 클래스를 가져올 수있었습니다.


0

문제가 발생했는데 레이아웃에 사용 된 필드가 문자열이 아니고 날짜였습니다.

적어도 TexView 구성 요소를 사용하면 모든 필드가 텍스트 여야합니다.

./gradlew build --stacktrace 명령으로 빌드하는 경우

이것은 오류를 더 잘 보여줍니다.


0

제 경우에는 생성 된 클래스가 src폴더에있는 일반적인 클래스와 함께 나타나야한다고 생각했습니다 . 또한 생성 된 클래스의 이름이 약간 달라야한다고 생각했습니다. 모두 내 실수였습니다. 생성 된 클래스는 build폴더, build -> generated -> ...경로 에서 찾을 수 있습니다 . 활동에 생성 된 클래스의 가져 오기가없는 경우 가져 오기를 추가하십시오.

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

0

DataBindingUtil.setContentView에서 다음 오류가 발생하는 경우

해결되지 않은 참조 : activity_main

다음 import 문을 제거하기 만하면됩니다.

android.R 가져 오기

다른 포럼에서 해결책을 찾았습니다. 출처


0

최근에 기존 프로젝트를 androidx 로 마이그레이션 한 경우 다음에서 가져 오기를 대체해야합니다.

import com.yourpackagename.BR;

import androidx.databinding.library.baseAdapters.BR;

Google이 2 일 후에 마침내 해결책을 얻었습니다.


1
아니요 . 리소스 ( .R. ) 와 같은 바인딩 리소스 ( .BR . ). 프로젝트 리소스 (ID, 드로어 블, 색상 등)를 기반으로 생성되었으므로 프로젝트 패키지 ( your.project.package.BR)에 배치됩니다. 마음에 들지 내부 타사 라이브러리 androidx.databinding.library.baseAdapters.BR.
dphans

0

생성 된 디렉터리 아래에 파일이 표시되지 않는 경우가 있습니다. viewmodel에서 선언되지 않은 속성을 바인딩 할 수 있습니다. xml에서 그렇게하면 본질적으로 lint 오류가 발생하지 않습니다.


0

Serializable을 구현하는 경우 -> Serializable을 구현해야합니다.

그렇지 않으면이 오류가 발생합니다. 미래에 누군가를 도울 수 있기를 바랍니다.

제 경우에는 Parcel 라이브러리를 사용합니다. 내 하위 클래스에서 @Parcel 주석을 작성하지 못했습니다.


0

위의 단계 외에도 변수 유형을 확인할 수도 있습니다. TextView의 문자열이거나 BindingAdapter. 예를 들면 :

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

그리고 XML :

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

이로 인해 위의 오류가 발생합니다. 문제를 해결하려면 String 유형의 연령 변수를 만들거나 XML에서 String을 가져 와서 String.valueOf(age)다음과 같이 사용할 수 있습니다 .

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

그리고 TextView에서 :

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

0

내 해결책은 클래스 이름에 접미사 FragmentBinding을 사용하는 것입니다.

각 레이아웃 파일에 대해 바인딩 클래스가 생성됩니다. 기본적으로 클래스 이름은 레이아웃 파일의 이름을 기반으로하며 파일을 Pascal 케이스로 변환하고 Binding 접미사를 추가합니다. 위의 레이아웃 파일 이름은 activity_main.xml이므로 해당 생성 클래스는 ActivityMainBinding입니다. 이 클래스는 레이아웃 속성 (예 : 사용자 변수)에서 레이아웃 뷰로의 모든 바인딩을 보유하고 바인딩 식에 값을 할당하는 방법을 알고 있습니다.

활동 또는 조각 클래스 이름의 명명법은 접두사 측면에서 다를 수 있습니다. 접미사는 항상 바인딩이기 때문입니다.

의 응답 다음 후 Khemraj무효화 캐시 / 다시 시작을 , 당신은 ActivityBinding 또는 FragmentBinding를 다시 작성해야 이미 생성 된 및 가져 오기를 하드 코딩하지 마십시오 클래스의 IDE 제안을 얻을 수 있습니다.

내 경우에는 내가 뒤로 할 클래스의 이름을 가져올려고 FragmentCompetitionsBinding대신CompetitionsFragmentBinding .

GL

출처


0

제 경우에는 mipmap Android Resource Directory를 삭제했기 때문에 데이터 바인딩 클래스가 생성되지 않았습니다. res / mipmap / 디렉토리를 다시 만들고 데이터 바인딩 클래스가 복원되었습니다.


0

DataBinding이 BindingImpl 클래스 를 생성하지 못하는 유사한 문제가 발생했습니다 . 제 경우에는 이름이 잘못 사용 된 데이터 클래스의 메서드에서 문제가 발생했습니다. 모델에 onSignInCliked () 메서드가 포함 되어 있고 레이아웃에서 onSigninCliked ()를 사용 했습니다 . 통지 로그인의로그인 완료를 .

오류 메시지가 충분하지 않았고 스택 추적 옵션과 함께 빌드 스크립트를 사용할 때만 문제를 발견했습니다.


0

데이터 바인딩이 활성화되었는지 확인

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

Gradle과 프로젝트 동기화 버튼을 클릭하십시오 (Gradle과 프로젝트 동기화)


0

XML 파일에 문제가있는 경우 Databinding 클래스 생성 . 빠른 수정은 XML 파일을 실행하고 구문 오류 (일반적으로 빨간색으로 강조 표시됨)를 확인하는 것입니다. 오류는 존재하지 않거나 잘못된 참조, 인쇄상의 오류 등의 형태로 올 수 있습니다.

본질적으로 XML 코드에 빨간색 밑줄이 없는지 확인하십시오. 완료되면 다시 빌드하고 Databinding 클래스가 생성되었을 것입니다.


-1

1. 앱 gradle에 아래 추가

 dataBinding {
        enabled = true
    }

2. xml 레이아웃에서 아래 코드 작성

<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
일반적인 경우 dataBinding에 인터넷 권한이 필요한 이유는 무엇입니까?
M.Pomeroy

1
필요하지 않은 예 @ M.Pomeroy, 응답 덕분에 편집 한
로한 Lodhi

-5

클래스 경로 'com.android.databinding : dataBinder : 1.0-rc0'사용


gradle 1.5.0 이상에서는이 클래스 경로를 사용할 필요가 없습니다.
Ravi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.