Подтвердить что ты не робот

Не может найти символ BR в привязке данных к android

Я хочу использовать привязку данных Android и настроен в соответствии с официальным документом.

сообщение об ошибке: ошибка: не удается найти символ import 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()
    }
}

и файл 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?

4b9b3361

Ответ 2

Если у кого-то еще есть эта проблема. Я решил это, сделав недействительным кеш в Android Studio. И я использую Android Studio 2 с API 23

Файл > Invalidate Caches/Restart

Ответ 3

Я нахожу причину проблемы в моем случае. Я обнаружил, что в операторах импорта моего класса Data Object содержится:

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

Проблема решена после того, как я удалил это. Android Studio почему-то решила BR класс неправильно для меня.

Ответ 4

Аннотации Bindable генерируют запись в файле класса BR во время компиляции. Файл класса BR будет создан в пакете модулей.

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

Ответ 5

Если вы используете Kotlin, попробуйте применить следующий плагин к файлу build.gradle вашего приложения:

apply plugin: 'kotlin-kapt'

Очистите ваш проект и постройте его снова. Это решило проблему для меня.

Ответ 6

Я тоже столкнулся с этой проблемой. Проблема заключалась в том, что я изменил имя класса и не обновил значения в файле XML. Сюда входят имена переменных и где они доступны в XML файле.

Ответ 7

У меня тоже такое же сообщение об ошибке, но моя основная причина отличалась от того, что было распространено здесь.

В моем случае проблема заключалась в том, что после того, как я разрешил конфликт слиянием, я по ошибке оставил дополнительную аннотацию @Override для метода. Таким образом, препроцессор JVM завершился с ошибкой, а затем также были созданы классы привязки данных.

Раздражающей частью для меня было то, что я не смог увидеть сообщение об ошибке, связанное с этим, или было трудно обнаружить среди всех других ошибок компилятора. И Android Studio также не показывает дополнительную аннотацию как ошибку. Поэтому в случае, если кто-то другой борется с той же ошибкой, убедитесь, что у вас нет ошибки в некоторых комментариях, которые предотвращают использование препроцессора APT.

Ответ 8

В моем случае проблема была вызвана

": переменная MyVariable уже определена в классе MyModel"

Досадная вещь была в Android Studio gradle, сборка не отображала эту ошибку внизу. Мне пришлось прокомментировать каждую ошибку привязки данных > Rebuild Project, пока не дойду до ошибки. Извлеченный урок состоял в том, чтобы просканировать каждую ошибку снизу вверх и заметить все, что вы, возможно, недавно изменили.

Ответ 9

Просто перезагрузка Android Studio без аннулирования кеша сделала трюк для меня (я использую версию 2.2.3).

Ответ 10

Если вы используете версию 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}

построить .gradle, затем синхронизировать файл gradle.

Ответ 11

У меня было это плюс 29 других ошибок, внезапно возникающих от одного момента до следующего. Я пытался очистить, восстановить, сделать недействительными кэши/перезапустить и не повезло. В конце я удалил сделанные мной изменения и переделал их один за другим. Обнаружил, что у меня @Inject есть служба в неправильном классе. Как только я удалил, все 30 ошибок исчезли. Ошибки не дали понять, что я сделал неправильно.

Ответ 12

Для меня это помогло запустить ./gradlew clean build в папке проекта. Это показало ошибку, которую не сделала студия android.

Ответ 13

Вы должны добавить это в свой файл gradle.properties

android.databinding.enableV2=true

От developer.android.com

Вы можете получить несколько ошибок, сообщающих, что классы привязки не найдены. Новый компилятор привязки данных предотвращает эти ошибки, генерируя классы привязки до того, как управляемый компилятор создаст ваше приложение.

Ответ 14

Если вы используете Dagger 2, проблема может быть вызвана компонентами кинжала. Хотя две библиотеки не связаны, в моем случае исправление ошибок в Dagger, о которых сообщалось в компиляторе, приводит к тому, что класс BR снова появляется правильно.

Ответ 15

BR генерируется во время компиляции, Build → Rebuild project должны сделать свое дело. Но для меня это не удалось с ошибкой: e: /home/xx/File.kt: (24, 46): Expecting an element потому что в этой строке у меня был неполный BR. , Просто комментируя или добавляя что-нибудь после . и восстановление решило это.

Ответ 16

Просто выполните следующие шаги: 1. Расширьте свой класс с помощью BaseObservable class 2. Добавьте аннотацию @Bindable для каждого метода получения. 3. Перестройте проект. Теперь вы сможете получить доступ к BR

Ответ 17

  • В моем случае я не предоставил аннотацию @PrimaryKey ни на одном объекте, и было действительно трудно найти эту ошибку, так как в логах нет подсказки, чтобы найти ее. поэтому обязательно предоставьте вашей сущности первичный ключ, иначе возникнет эта ошибка.

Ответ 18

В моем случае я попытался просто запустить проект, и это решило проблему.

Ответ 19

Добавить зависимость

implementation "androidx.lifecycle:lifecycle-extensions:2.1.0"

Затем синхронизируйте проект. Даже если это не работает, отключите кэш и перезапустите, затем очистите & перестроить проект.

Ответ 20

Добавьте в свой класс Object следующий импорт:

import com.android.databinding.library.baseAdapters.BR;