Data Binding Android - параметр T имеет несовместимые верхние границы: ViewDataBinding и MainActivity
Я использую Android Studio 2.0 Preview 4.
Я использую инструменты Android SDK 25 rc1. Эта ошибка сохраняется независимо от того, сколько раз я очищаю/восстанавливаю проект. File- > Invalidate Кэши и перезагрузка также не работают.
Я не могу запустить самый простой пример привязки данных.
build.gradle file
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.example.chiragshenoy.myapplication"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
}
MainActivity.java
package com.example.chiragshenoy.myapplication;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainActivity binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("Test", "User");
binding.setUser(user);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.chiragshenoy.myapplication.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
это мой файл верхнего уровня build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0-alpha3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Ответы
Ответ 1
Если ваша версия gradle в порядке (1.5+), вы должны попробовать следующее:
- Перейдите в свой "some_layout.xml"
- Щелкните правой кнопкой мыши → Рефакторинг → Переименовать (или SHIFT + F6)
- Переименуйте свой макет на "some_layout2.xml", например
- Переименуйте этот файл обратно в исходный файл "some_layout.xml"
Это может решить проблему. Сообщите нам.
Ответ 2
Это решение сработало для меня "File → Invalidate Caches/Restart"
fooobar.com/questions/211497/...
Ответ 3
Вы должны использовать:
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
В onCreate
MainActivity не является сгенерированным классом Binding.
Ответ 4
Я просто подумал, основываясь на Felipe Gualberto's Отвечать, и я получил способ разности решений.
Если вы написали несколько представлений с тем же id в разных XML, сделайте его уникальным.
Спасибо.
Ответ 5
Один из самых быстрых взломов, которые я использую, переименовывает xml файл и.
например.
переименуйте abc_layout.xml
в abc_layout2.xml
. как только импорт привязки показывает ошибку, переименуйте его обратно в abc_layout.xml
.
сокращение для переименования - shift + F6
. его путь быстрее, чем перестроить весь проект. это только удалит ошибку из одного файла.
Ответ 6
По умолчанию класс Binding
будет создан на основе имени файла макета, преобразовав его в регистр Pascal и добавив к нему суффикс "Binding". Файл макета выше был main_activity.xml, поэтому класс генерации был MainActivityBinding. Проблема в том, что вы пытаетесь создать класс привязки вручную.
Этот класс содержит все привязки из свойств макета (например, переменный пользователя) к компоновочным Views
и знает, как присвоить значения для связывания выражений. Самый простой способ создания привязок - это делать это во время надувания. Не нужно перезагружать Android Studio.
Ответ 7
в верхнем уровне. Использование файла Build.Gradle gradle 1.5.0 или выше
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
}
если он меньше 1.5.0, то используйте этот файл также в файле верхнего уровня gradle
classpath "com.android.databinding:dataBinder:1.0-rc4"
Ответ 8
Просто попробуйте сделать недействительными кэши/перезапустить из файла. Это сработало для меня.
Ответ 9
Я также получаю ту же проблему после переноса моего существующего проекта на AndroidX, и я решаю ее, выполнив следующие действия
Build -> Clean Project
Build -> Rebuild Project
После этого
File → Invalidate Caches/Restart...
Ответ 10
Сделай это
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
Вместо
MainActivity binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
Ответ 11
Для меня была еще одна переменная с таким же именем. отсюда и эта ошибка.
Ответ 12
Try This Work for sure...
Step 1: Add this code in the build.gradle(Mobile:app)
dataBinding {
enabled = true
}
Example:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
**dataBinding {
enabled = true
}**
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
.....
}
Step 2:
Binding Can be done with Name of the .xml file as below example..
Simply name of the xml file and prefix with binding...
Example 1:
if of your .xml file is activity_main.xml then Binding file should be MainActivityBinding
Example 2:
if of your .xml file is android_sunil.xml then Binding file should be AndroidSunilBinding
Step 3: Sample Code:
public class BaseObservableActivity extends AppCompatActivity {
private ActivityBaseobservableBinding activityMainBinding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_baseobservable);
}
}
In the above code my .xml file name is activity_baseobservable so my binding class should be ActivityBaseobservableBinding activityMainBinding
--Happy Android [email protected]
Ответ 13
Проверьте имя класса привязки, здесь ActivityMainInitBinding создается на основе XML файла activity_mail_init.xml. Если вы используете неправильный класс, появляется ошибка.
val binding : ActivityMainInitBinding=
DataBindingUtil.setContentView(this, R.layout.activity_main_init)
Ответ 14
После перехода на AndoridX вам нужно удалить старые виджеты v4 или v7 из XMl. Для ex - вам нужно заменить, если вы используете какой-то виджет AppCompat, например
<android.support.v7.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:tag="showMore"/>
Замените его на виджет andoridx
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txt_summary_desc_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:text="Read More"/>
у меня хорошо сработало.
Ответ 15
Обновление бесполезно, если оно продолжает давать ошибки.
Когда есть эти ошибки, вполне вероятно, что в вашем XML файле есть проблема, которую компилятор не показывал вам при создании макета.
На самом деле, может случиться так, что эта ошибка видна только в ее папке "debug". Если возникает ошибка такого типа, просто проследите за ошибкой в папке отладки и исправьте ее из исходного файла.
В моем случае ошибка состояла из двух дубликатов
xmlns: app = "http://schemas.android.com/apk/res-auto"
что я не мог видеть
Ответ 16
Есть простое решение.
- нажмите "Файл" на панели инструментов Android-студии
- нажмите "Invalidate Caches и Restart", и все заработает.
Надеюсь, этот ответ поможет вам.