web-dev-qa-db-ja.com

AndroidデータバインディングでシンボルBRが見つかりません

Android Data Bindingを使用し、公式ドキュメントに従って構成しました。

エラーメッセージ:エラー:シンボルインポートnet.juude.droidviews.BRが見つかりません。

トップレベルbuild.gradleファイルは次のとおりです。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "com.Android.tools.build:gradle:1.3.0-beta2"
        classpath 'me.tatarka:gradle-retrolambda:3.0.1'
        classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.4'
        classpath "com.Android.databinding:dataBinder:1.0-rc0"
    }
}
allprojects {
    repositories {
        jcenter()
        mavenCentral()
    }
}

そして、appモジュールのbuild.gradleファイルは

apply plugin: 'com.Android.application'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'com.neenbedankt.Android-apt'
apply plugin: 'com.Android.databinding'


Android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    lintOptions {
        abortOnError false
    }

    defaultConfig {
        applicationId "net.juude.droidviews"
        minSdkVersion 15
        targetSdkVersion 22 
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.txt'
        }
    }
    retrolambda {
        println("Java_HOME: " + System.getenv("Java_HOME"))
        println("Java7_HOME: " + System.getenv("Java7_HOME"))
        println("Java8_HOME: " + System.getenv("Java8_HOME"))
        javaVersion JavaVersion.VERSION_1_7
    }
}

dependencies {
    compile project(':ptr-lib-debug')
    compile project(':library')
    compile 'com.Android.support:support-v4:22.1.0'
    compile 'com.mcxiaoke.volley:library:1.0.+'
    compile files('libs/droidmocks.jar')
    compile 'com.Android.support:support-annotations:22.1.1'
    compile 'com.facebook.fresco:fresco:0.5.0'
    compile 'com.Android.support:recyclerview-v7:22.1.1'
    compile 'io.reactivex:rxandroid:0.24.0'
    compile 'io.reactivex:rxjava:1.0.6'
    compile 'com.google.dagger:dagger:2.0'
    apt 'com.google.dagger:dagger-compiler:2.0'
}

レイアウトファイルは

<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <data>
        <variable name="user" type=" net.juude.droidviews.databinding.User" />
    </data>
    <LinearLayout
        Android:orientation="vertical" Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <TextView
            Android:id="@+id/user_name"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@{user.mName}"/>

        <TextView
            Android:id="@+id/user_sex"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@{user.sex}"/>

    </LinearLayout>
</layout>

フラグメントは

package net.juude.droidviews.databinding;

import Android.databinding.DataBindingUtil;
import Android.databinding.ViewDataBinding;
import Android.os.Bundle;
import Android.support.annotation.Nullable;
import Android.support.v4.app.Fragment;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;

import net.juude.droidviews.BR;
import net.juude.droidviews.R;

/**
 * Created by juude on 15-6-9.
 */
public class DataBindingFragment extends Fragment{
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewDataBinding dataBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_data_binding, container, false);
        //dataBinding.setVariable(BR.)
        User user = new User();
        user.setSex("男");
        user.setName("Juude");
        dataBinding.setVariable(BR.user, user);
        return dataBinding.getRoot();
    }
}

Android Studioで構文エラーが発生しなかったので、Android StudioはBRクラスを認識できます。

しかし、プロジェクトをコンパイルすると、error:cannot find symbol class BR

正しいBR.Javaファイルを生成するために何をすべきか知りたいのですが。

38
Juude

これは、Android-aptプラグインが原因の問題です。データバインディングプラグインが追加する提供された依存関係は無視されます。

https://bitbucket.org/hvisser/Android-apt/issue/38/Android-apt-breaks-brand-new-data-binding#comment-18504545

以下を追加することで回避できます:apt 'com.Android.databinding:compiler:1.0-rc0 gradleファイルに。

23
yigit

誰かがまだこの問題を抱えている場合。 Android St​​udioのキャッシュを無効にすることでこれを解決しました。そして、Android St​​udio 2とAPI 23を使用しています

ファイル>キャッシュの無効化/再起動

31
Hybrid SyntaX

私の場合、問題の原因を見つけました。私のデータオブジェクトクラスのインポートステートメントには次のものが含まれています:

import static Android.databinding.tool.util.GenerationalClassUtil.ExtensionFilter.BR;

私はそれを削除した後、問題が解決されます。 Android StudioはどういうわけかBRクラスを間違って解決しました。

7
David Cheung

Bindableアノテーションは、コンパイル時にBRクラスファイルにエントリを生成します。モジュールパッケージにBRクラスファイルが生成されます。

@Bindable
   public String getFirstName() {
       return this.firstName;
   }
6

Kotlinを使用している場合、次のプラグインをアプリに適用してくださいbuild.gradleファイル:

apply plugin: 'kotlin-kapt'

プロジェクトをクリーンアップして、再度ビルドします。これで問題が解決しました。

5
Henrique

私もこの問題に遭遇しました。問題は、クラス名を変更し、XMLファイルの値を更新しなかったことです。これには、変数名と、xmlファイル内の変数へのアクセス場所が含まれます。

4
Nick

私の場合、問題の原因は

「エラー:変数MyVariableはクラスMyModelですでに定義されています」

迷惑なのはAndroid Studio gradleビルドは下部にこのエラーを表示しませんでした。各データバインディングエラーをコメントする必要がありました。エラーに達するまでプロジェクトを再構築します。下から上に移動して、最近変更した可能性のあるものに注目してください。

4
Hau Le

私も同じエラーメッセージを受け取りましたが、根本原因はここで共有されたものとは異なりました。

私の場合、問題は、マージの競合を解決した後、誤って余分な@Overrideメソッドの注釈。したがって、JVMプリプロセッサは失敗し、データバインディングクラスも生成されませんでした。

私にとっていらいらした部分は、これに関連するエラーメッセージが表示されなかったこと、または他のすべてのコンパイラエラーを見つけるのが困難だったことです。また、Android Studioは追加の注釈をエラーとして表示しません。だから、他の誰かが同じエラーで苦労している場合は、= APTプリプロセッサが起動します。

4
Johan Paul

これに加えて、ある瞬間から次の瞬間に突然29個のエラーが発生しました。クリーン、リビルド、キャッシュの無効化/再起動を試みましたが、運はありませんでした。最後に、行った変更を削除し、1つずつ変更しました。 @Injected間違ったクラスのサービス。 30個すべてのエラーがなくなったことを削除したら。エラーは、私が間違ったことをする手がかりを与えませんでした。

3
tplive

Android Studio、キャッシュを無効にせずに再起動するだけで、私にとってはうまくいきました(バージョン2.2.3を使用しています)。

3
Honza Kalfus

Android Studio 2.3リリースを使用し、プロジェクト構成が次のとおりである場合:

Gradle version: 3.3
Android plugin version:2.3.0
Compile sdk Version:23+
build tools Version:25+

追加するだけです

dataBinding{enabled=true}

build.gradleに、その後gradleファイルを同期します。

3
WiselyL

これをgradle.propertiesファイルに追加する必要があります

Android.databinding.enableV2=true

developer.Android.com から

バインディングクラスが見つからないことを報告する複数のエラーが表示される場合があります。新しいデータバインディングコンパイラは、マネージコンパイラがアプリをビルドする前にバインディングクラスを生成することにより、これらのエラーを防ぎます。

2
M'hamed

私にとっては、./gradlew clean buildプロジェクトフォルダー。 Android studioはしませんでした。

2
anstue

BRはコンパイル中に生成されます。Build -> Rebuild projectがトリックを行う必要があります。しかし、私にとってそれはエラーで失敗しました:e:/home/xx/File.kt: (24, 46): Expecting an elementその行には不完全なBR.があったからです。 .の後にコメントするか何かを追加して、再構築するだけで解決しました。

1

次の手順に従ってください。1.BaseObservableクラスでクラスを拡張します2.各getterメソッドに@Bindableアノテーションを追加します。 3.プロジェクトを再構築します。これでBRにアクセスできるようになります

Dagger 2を使用している場合、問題はDaggerのコンポーネントが原因である可能性があります。 2つのライブラリは関連していませんが、私の場合、コンパイラで報告されたDaggerのエラーを修正すると、BRクラスが再び正しく表示されます。

1
KaungMyat Min
  • 私の場合、エンティティの1つに@PrimaryKeyアノテーションを提供しておらず、ログに見つける手がかりがないため、このエラーを見つけるのは本当に困難でした。そのため、必ずエンティティに主キーを指定してください。そうしないと、このエラーが発生します。

0
Jay Dangar

私の場合、プロジェクトを実行するだけで問題が解決しました。

0
heisenberg91