Ответ 1
Это проблема, вызванная плагином android-apt. Он игнорирует предоставленную зависимость, которую добавляет плагин привязки данных.
Вы можете обойти это, добавив:
apt 'com.android.databinding:compiler:1.0-rc0
в ваш gradle файл.
Я хочу использовать привязку данных 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?
Это проблема, вызванная плагином android-apt. Он игнорирует предоставленную зависимость, которую добавляет плагин привязки данных.
Вы можете обойти это, добавив:
apt 'com.android.databinding:compiler:1.0-rc0
в ваш gradle файл.
Если у кого-то еще есть эта проблема. Я решил это, сделав недействительным кеш в Android Studio. И я использую Android Studio 2 с API 23
Я нахожу причину проблемы в моем случае. Я обнаружил, что в операторах импорта моего класса Data Object содержится:
import static android.databinding.tool.util.GenerationalClassUtil.ExtensionFilter.BR;
Проблема решена после того, как я удалил это. Android Studio почему-то решила BR класс неправильно для меня.
Аннотации Bindable генерируют запись в файле класса BR во время компиляции. Файл класса BR будет создан в пакете модулей.
@Bindable
public String getFirstName() {
return this.firstName;
}
Если вы используете Kotlin, попробуйте применить следующий плагин к файлу build.gradle
вашего приложения:
apply plugin: 'kotlin-kapt'
Очистите ваш проект и постройте его снова. Это решило проблему для меня.
Я тоже столкнулся с этой проблемой. Проблема заключалась в том, что я изменил имя класса и не обновил значения в файле XML. Сюда входят имена переменных и где они доступны в XML файле.
У меня тоже такое же сообщение об ошибке, но моя основная причина отличалась от того, что было распространено здесь.
В моем случае проблема заключалась в том, что после того, как я разрешил конфликт слиянием, я по ошибке оставил дополнительную аннотацию @Override
для метода. Таким образом, препроцессор JVM завершился с ошибкой, а затем также были созданы классы привязки данных.
Раздражающей частью для меня было то, что я не смог увидеть сообщение об ошибке, связанное с этим, или было трудно обнаружить среди всех других ошибок компилятора. И Android Studio также не показывает дополнительную аннотацию как ошибку. Поэтому в случае, если кто-то другой борется с той же ошибкой, убедитесь, что у вас нет ошибки в некоторых комментариях, которые предотвращают использование препроцессора APT.
В моем случае проблема была вызвана
": переменная MyVariable уже определена в классе MyModel"
Досадная вещь была в Android Studio gradle, сборка не отображала эту ошибку внизу. Мне пришлось прокомментировать каждую ошибку привязки данных > Rebuild Project, пока не дойду до ошибки. Извлеченный урок состоял в том, чтобы просканировать каждую ошибку снизу вверх и заметить все, что вы, возможно, недавно изменили.
Просто перезагрузка Android Studio без аннулирования кеша сделала трюк для меня (я использую версию 2.2.3).
Если вы используете версию 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.
У меня было это плюс 29 других ошибок, внезапно возникающих от одного момента до следующего. Я пытался очистить, восстановить, сделать недействительными кэши/перезапустить и не повезло. В конце я удалил сделанные мной изменения и переделал их один за другим. Обнаружил, что у меня @Inject
есть служба в неправильном классе. Как только я удалил, все 30 ошибок исчезли. Ошибки не дали понять, что я сделал неправильно.
Для меня это помогло запустить ./gradlew clean build
в папке проекта. Это показало ошибку, которую не сделала студия android.
Вы должны добавить это в свой файл gradle.properties
android.databinding.enableV2=true
Вы можете получить несколько ошибок, сообщающих, что классы привязки не найдены. Новый компилятор привязки данных предотвращает эти ошибки, генерируя классы привязки до того, как управляемый компилятор создаст ваше приложение.
Если вы используете Dagger 2, проблема может быть вызвана компонентами кинжала. Хотя две библиотеки не связаны, в моем случае исправление ошибок в Dagger, о которых сообщалось в компиляторе, приводит к тому, что класс BR снова появляется правильно.
BR генерируется во время компиляции, Build → Rebuild project
должны сделать свое дело. Но для меня это не удалось с ошибкой: e: /home/xx/File.kt: (24, 46): Expecting an element
потому что в этой строке у меня был неполный BR.
, Просто комментируя или добавляя что-нибудь после .
и восстановление решило это.
Просто выполните следующие шаги: 1. Расширьте свой класс с помощью BaseObservable class 2. Добавьте аннотацию @Bindable для каждого метода получения. 3. Перестройте проект. Теперь вы сможете получить доступ к BR
В моем случае я не предоставил аннотацию @PrimaryKey ни на одном объекте, и было действительно трудно найти эту ошибку, так как в логах нет подсказки, чтобы найти ее. поэтому обязательно предоставьте вашей сущности первичный ключ, иначе возникнет эта ошибка.
В моем случае я попытался просто запустить проект, и это решило проблему.
Добавить зависимость
implementation "androidx.lifecycle:lifecycle-extensions:2.1.0"
Затем синхронизируйте проект. Даже если это не работает, отключите кэш и перезапустите, затем очистите & перестроить проект.
Добавьте в свой класс Object следующий импорт:
import com.android.databinding.library.baseAdapters.BR;