web-dev-qa-db-fra.com

Liaison de données Android - Le paramètre de type T a des limites supérieures incompatibles: ViewDataBinding et MainActivity

J'utilise Android Studio 2.0 Preview 4 . J'utilise des outils de SDK Android 25 rc1. Cette erreur persiste quel que soit le nombre de fois que je nettoie/reconstruis le projet. Fichier-> Invalider Les caches et les redémarrages ne fonctionnent pas non plus .. Je ne suis pas en mesure d'exécuter l'exemple le plus élémentaire de liaison de données.

fichier build.gradle

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>

c'est mon fichier build.gradle de niveau supérieur

// 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
}
29
Chirag Shenoy

Si votre version est correcte (1.5+), essayez ceci:

  1. Allez dans votre "some_layout.xml"
  2. Cliquez à droite -> Refactor -> Renommer (ou MAJ + F6)
  3. Renommez votre mise en page en "some_layout2.xml" par exemple
  4. Renommez ce fichier à l'original "some_layout.xml"

Cela pourrait résoudre le problème. Laissez nous savoir.

111
Felipe Gualberto

Cette solution a fonctionné pour moi "Fichier -> Invalidate Caches/Restart" https://stackoverflow.com/a/32191257/2205809

14
Andrew Kelly

Tu devrais utiliser:

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

Dans onCreate

MainActivity n'est pas la classe Binding générée.

4
George Mount

Je pensais juste en me basant sur Felipe GualbertoAnswer et j'ai obtenu une solution différente.

Si vous avez écrit plusieurs vues avec le même id dans différents XML, rendez-le unique.

Je vous remercie.

4
Pratik Butani

Par défaut, une classe Binding sera générée en fonction du nom du fichier de présentation, convertie en casse Pascal et complétée par "Binding". Le fichier de présentation ci-dessus était main_activity.xml , de sorte que la classe de génération était MainActivityBinding . Le problème est que vous essayez de créer manuellement une classe de liaison. 

Cette classe contient toutes les liaisons des propriétés de présentation (par exemple, la variable utilisateur) à la variable Views de la présentation et sait comment affecter des valeurs aux expressions de liaison. Le moyen le plus simple de créer les liaisons est de le faire en gonflant . Il n'est pas nécessaire de redémarrer Android Studio.

3
Libin Thomas

Un des hack les plus rapides que j’utilise est de renommer le fichier xml.

par exemple.

renommez abc_layout.xml en abc_layout2.xml. une fois que l'importation de liaison indique une erreur, renommez-la en abc_layout.xml

le raccourci pour renommer est shift + F6. son chemin plus rapidement que l'ensemble du projet reconstruit. cela ne supprimera cependant l'erreur que d'un seul fichier.

2
Ankit

dans le fichier Build.Gradle de niveau supérieur, utilisez gradle 1.5.0 ou une version ultérieure 

 dependencies {
    classpath 'com.Android.tools.build:gradle:1.5.0'
}

s'il est inférieur à 1.5.0, utilisez celui-ci également dans le fichier de niveau supérieur

        classpath "com.Android.databinding:dataBinder:1.0-rc4"
2

Faire ceci

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

Au lieu de 

MainActivity binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
0
Khemraj