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

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
}
4b9b3361

Ответ 1

Если ваша версия gradle в порядке (1.5+), вы должны попробовать следующее:

  • Перейдите в свой "some_layout.xml"
  • Щелкните правой кнопкой мыши → Рефакторинг → Переименовать (или SHIFT + F6)
  • Переименуйте свой макет на "some_layout2.xml", например
  • Переименуйте этот файл обратно в исходный файл "some_layout.xml"

Это может решить проблему. Сообщите нам.

Ответ 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

Просто попробуйте сделать недействительными кэши/перезапустить из файла. Это сработало для меня.

Ответ 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

Есть простое решение.

  1. нажмите "Файл" на панели инструментов Android-студии
  2. нажмите "Invalidate Caches и Restart", и все заработает.

Надеюсь, этот ответ поможет вам.