数据绑定 Android - 类型参数 T 具有不兼容的上限:ViewDataBinding 和 MainActivity

Posted

技术标签:

【中文标题】数据绑定 Android - 类型参数 T 具有不兼容的上限:ViewDataBinding 和 MainActivity【英文标题】:Data Binding Android - Type parameter T has incompatible upper bounds : ViewDataBinding and MainActivity 【发布时间】:2016-03-25 21:54:46 【问题描述】:

我正在使用 android Studio 2.0 Preview 4。 我正在使用 Android SDK 工具 25 rc1。无论我清理/重建项目多少次,此错误都会持续存在。 File-> Invalidate Caches and restart 也不起作用。 我无法运行最基本的数据绑定示例。

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_
        android:layout_>
        <TextView android:layout_
            android:layout_
            android:text="@user.firstName"/>
        <TextView android:layout_
            android:layout_
            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

【问题讨论】:

您可能想为 gradle、xml 和活动添加代码! 您的Gradle 版本是多少? (非插件版)可以在app找到(右键)->Open Module Settings->Project 我在更新 android 插件和 Gradle 时发现了这个问题,只需使缓存无效并重新启动即可解决。 【参考方案1】:

如果你的 gradle 版本没问题(1.5+)那么你应该试试这个:

    转到您的“some_layout.xml” 点击右键 -> 重构 -> 重命名(或 SHIFT + F6) 例如将布局重命名为“some_layout2.xml” 将此文件重命名回原来的“some_layout.xml”

这可能会解决问题。让我们知道。

【讨论】:

重命名后生效。这种bug应该马上解决。 我升级到 gradle 2.2.3 并且这个错误出现在我面前。上面的修复对我有用!我猜这会导致 IDE 正确地重新生成代码。 为我工作,但为什么会出现这个问题?如果我清理并重建项目,为什么它不会消失? Android Gradle 插件仍然存在此错误:2.3.0-beta4。 这是什么Bug?【参考方案2】:

这个解决方案对我有用“文件 -> 使缓存无效/重新启动” https://***.com/a/32191257/2205809

【讨论】:

【参考方案3】:

有一个简单的解决方案。

    点击android studio工具栏上的“文件” 点击“Invalidate Caches and Restart”,就可以了。

希望这个答案对你有所帮助。

【讨论】:

欢迎来到 SO!当您发布答案时,请尝试稍微解释一下,此外,在您的情况下,您再次给出的答案是未附加的图像。即使是对的。【参考方案4】:

你应该使用:

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

在 onCreate 中

MainActivity 不是生成的 Binding 类。

【讨论】:

【参考方案5】:

我只是根据 Felipe Gualberto 的 Answer 想到的,我得到了解决方案的不同方式。

如果您在不同的 XML 中编写了具有相同 id 的多个视图,则使其唯一。

谢谢。

【讨论】:

【参考方案6】:

我使用的最快的 hack 之一是将 xml 文件重命名为。

例如

abc_layout.xml 重命名为abc_layout2.xml。一旦绑定导入显示错误,将其重命名为abc_layout.xml

重命名的捷径是shift + F6。整个项目的重建速度更快。但这只会从一个文件中删除错误。

【讨论】:

【参考方案7】:

默认情况下,会根据布局文件的名称生成一个Binding类,将其转换为Pascal大小写,并为其添加“Binding”后缀。上面的布局文件是ma​​in_activity.xml,所以生成的类是MainActivityBinding。问题是您正在尝试手动创建绑定类。

这个类包含从布局属性(例如用户变量)到布局的Views 的所有绑定,并且知道如何为绑定表达式分配值。创建绑定的最简单方法是在充气时进行。 无需重启 Android Studio。

【讨论】:

【参考方案8】:

在顶层 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"

【讨论】:

他似乎已经在使用 1.5+ .. 我认为这不是问题所在。 也试过 1.5.0。那也行不通。同样的错误。【参考方案9】:

只需尝试使缓存无效/从文件重新启动。这对我有用。

【讨论】:

【参考方案10】:

Migrating my existing project to AndroidX 之后我也遇到了同样的问题,我通过以下方式解决了它

Build -> Clean Project
Build -> Rebuild Project

之后

File -&gt; Invalidate Caches/Restart...

【讨论】:

【参考方案11】:

我通过用&lt;layout&gt; 标记包围我的xml 布局文件来修复此错误

your_layout.xml 文件应该类似于

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

<androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/view_textView"
        android:layout_
        android:layout_/>
</layout>

这对我有用。

【讨论】:

【参考方案12】:

这样做

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

代替

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

【讨论】:

【参考方案13】:

查看绑定类的名称,这里ActivityMainInitBinding是根据xml文件activity_mail_init.xml生成的。如果你使用了错误的类,就会弹出错误。

  val binding : ActivityMainInitBinding=
        DataBindingUtil.setContentView(this, R.layout.activity_main_init)

【讨论】:

【参考方案14】:

迁移到 AndoridX 后,您需要从 XMl 中删除旧的 v4 或 v7 小部件。例如 - 如果您使用某些 AppCompat 小部件,则需要替换

<android.support.v7.widget.AppCompatTextView
                android:layout_
                android:layout_
                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_
                android:layout_
                android:textSize="11sp"
                android:layout_alignParentRight="true"
                android:layout_alignParentBottom="true"
                android:text="Read More"/>

对我来说效果很好。

【讨论】:

【参考方案15】:

如果继续出错,刷新是没有用的。 当出现这些错误时,很可能在您的 xml 文件中存在编译器在创建布局时没有向您显示的问题。 实际上,可能会发生此错误仅在其“调试”文件夹中可见。如果出现这种类型的错误,只需按照调试文件夹中的错误并从原始文件中更正即可。 在我的情况下,错误是两个重复的

 

xmlns: app = "http://schemas.android.com/apk/res-auto"

我看不到

【讨论】:

【参考方案16】:

删除模块级build 文件夹并重新打开您的项目。

【讨论】:

【参考方案17】:

我收到此错误是因为我错过了视图 xml 中的标签,但这里不是这种情况。

【讨论】:

以上是关于数据绑定 Android - 类型参数 T 具有不兼容的上限:ViewDataBinding 和 MainActivity的主要内容,如果未能解决你的问题,请参考以下文章

类型参数 t 具有不兼容的上限视图和列表视图

使用 Kotlin 和泛型进行数据绑定。错误:不兼容的类型:对象无法转换为列表

映射打字稿参数:绑定元素“列”隐式具有“任何”类型

SpringMVC请求参数的绑定

如何将 Objective-C initXXX 方法绑定到具有相同类型参数的 Xamarin.iOS 构造函数?

PDO Insert 将值 1 写入具有绑定参数的所有字段